在Java中寻找性能更好的字符串替换解决方案
给定一个只能有字母的字符串输入。如果存在AB、CD、BA、DC的组合,则应通过删除这些匹配项并返回结果字符串来转换字符串。 例如:在Java中寻找性能更好的字符串替换解决方案,java,string,algorithm,data-structures,replace,Java,String,Algorithm,Data Structures,Replace,给定一个只能有字母的字符串输入。如果存在AB、CD、BA、DC的组合,则应通过删除这些匹配项并返回结果字符串来转换字符串。 例如: 输入:ABDCC->输出:C 输入:CABADB->CABD->CD->输出:空字符串 我提出了下面一个使用字符串替换函数的解决方案,但正在寻找一个性能更好的或替代的解决方案。有什么想法吗 公共字符串转换字符串(字符串s){ HashSet stringsToRemove=新HashSet(); stringsToRemove.添加(“AB”); stringsTo
公共字符串转换字符串(字符串s){
HashSet stringsToRemove=新HashSet();
stringsToRemove.添加(“AB”);
stringsToRemove.添加(“BA”);
stringsToRemove.add(“CD”);
stringsToRemove.add(“DC”);
int prevLength=-1;
while(prevLength!=s.length()){
prevLength=s.length();
用于(字符串d:stringsToRemove){
s=s。替换(d,“”;
}
}
返回s;
}
从括号匹配中获取策略并使用堆栈。让您开始的解决方案草图:
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
if (stack.empty()) {
stack.push(c);
}
else {
char t = stack.peek();
if (/* t and c match, such as 'A' and 'B' */) {
stack.pop();
}
else {
stack.push(c);
}
}
}
// Return a string based on what's left in the stack.
Stack Stack=新堆栈();
for(char c:s.toCharArray()){
if(stack.empty()){
堆栈推送(c);
}
否则{
chart=stack.peek();
if(/*t和c匹配,例如'A'和'B'*/){
stack.pop();
}
否则{
堆栈推送(c);
}
}
}
//根据堆栈中剩余的内容返回字符串。
显然,只有当“匹配”没有边缘案例时,这才有效,比如user3386109在他们的评论中提到的案例
这只会在输入上传递两次(一次在循环中,一次用于展开堆栈以构建输出),因此输入大小的线性时间也是如此。问题可能比您想象的更难。例如,考虑要移除的字符串是AB和BC,并且输入是ABCB。您的代码将删除AB和CB。另一种方法是先删除BC,留下AB,然后删除AB,留下一个空字符串。
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
if (stack.empty()) {
stack.push(c);
}
else {
char t = stack.peek();
if (/* t and c match, such as 'A' and 'B' */) {
stack.pop();
}
else {
stack.push(c);
}
}
}
// Return a string based on what's left in the stack.