我有以下任务。有一个字符串。我必须根据6条规则在其中进行替换,直到可以在字符串中进行替换。
我找到的解决方案如下所示。它工作正常。问题是它的性能很低。我还能怎么根据多个规则进行替换?有没有什么算法?
附注:此任务来自codility网站。我的解决方案获得了100%的正确性和25%的性能。
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"));;
}
}
发布于 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
。
发布于 2016-06-01 09:08:45
您可以为此实现一个递归算法。然后,您可以减少规则并应用。例如AB -> AA,AA -> A,然后AB->A,那么答案将是
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);
}
}
发布于 2017-03-27 13:36:31
我更喜欢do while循环而不是递归:
这就是答案:
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;
}
https://stackoverflow.com/questions/33235126
复制相似问题