首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java:根据多个规则替换字符串

Java:根据多个规则替换字符串
EN

Stack Overflow用户
提问于 2015-10-20 19:12:06
回答 3查看 7.7K关注 0票数 5

我有以下任务。有一个字符串。我必须根据6条规则在其中进行替换,直到可以在字符串中进行替换。

我找到的解决方案如下所示。它工作正常。问题是它的性能很低。我还能怎么根据多个规则进行替换?有没有什么算法?

附注:此任务来自codility网站。我的解决方案获得了100%的正确性和25%的性能。

代码语言:javascript
复制
class Test {

    private Map<String,String> rules;

    private void initRules(){
        rules=new HashMap<>();
        rules.put("AB", "AA");
        rules.put("BA", "AA");
        rules.put("CB", "CC");
        rules.put("BC", "CC");
        rules.put("AA", "A");
        rules.put("CC", "C");
    }

    public String test(String S) {
        initRules();
        loop:while(true){
            String oldString=S;
            for (Map.Entry<String, String> rule : rules.entrySet())
            {
                S=S.replace(rule.getKey(), rule.getValue());
            }
            if (oldString==S){
                break loop;
            };
        }
        return S;
    }
}

 public class NewMain {

    public static void main(String[] args) {
        Test test=new Test();
        System.out.println("Result:"+test.test("ABBCC"));;
    }

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-20 19:28:29

这里有一个你可以使用的算法:

假设:字符串仅由(A,B,C)组成

如果字符串仅由B's组成(无账号),则输出=输入字符串。

否则:

按以下方式划分字符串。如果一个子字符串由(B,A)或(B,C)组成,则将它们相除。分别替换为A和C。这就是答案。

例如:假设字符串为:"BBBAABABBBCCBCBBCACB“。这将被划分为:

"BBBAABABBB“"CCBCBBC”"A“"CB”

这将导致输出字符串为:ACAC

基本上,只需忽略所有B's,将A's的集群替换为A,将C's的集群替换为C

票数 6
EN

Stack Overflow用户

发布于 2016-06-01 09:08:45

您可以为此实现一个递归算法。然后,您可以减少规则并应用。例如AB -> AA,AA -> A,然后AB->A,那么答案将是

代码语言:javascript
复制
public static String stringReduce(String s){
  String transformed = s.replace("AA", "A").replace("CC", "C")
   .replace("BC", "C").replace("CB", "C").replace("BA", "A")
   .replace("AB", "A");

  if(transformed.equals(s)){
    return transformed;
  }
  else{
    return stringReduce(transformed);
  }
}
票数 2
EN

Stack Overflow用户

发布于 2017-03-27 13:36:31

我更喜欢do while循环而不是递归:

这就是答案:

代码语言:javascript
复制
public String stringReduce(String input) {
    String previous;
    do {
        previous = input;
        input = input.replace("AA", "A").replace("CC", "C").replace("BC", "C").replace("CB", "C")
                .replace("BA", "A").replace("AB", "A");
    } while (!previous.equals(input));
    return input;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33235126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档