如何修改我的代码,以便删除O(n)
中另一个字符串中给定字符串(而不仅仅是字符串)中的所有字符?如果使用其他数据结构会有所帮助,请同时提示。
public static String removeChar(String s, char ch){
StringBuilder sb= new StringBuilder();
char[] charArray= s.toCharArray();
for (int i=0; i<charArray.length; i++){
if (charArray[i]!=ch) {
sb.append(charArray[i]);
}
}
return sb.toString();
}
有更快的方法吗?
更新:我想写一个像removeAllCharsInSecondStringFromFirstString(String S1, String S2)
答案 0 :(得分:2)
而不是迭代String
的每个字符,您可以使用String.indexOf(int)
和循环在ch
间隔之间添加每个子字符串。像,
public static String removeChar(String s, char ch) {
StringBuilder sb = new StringBuilder();
int p1 = 0, p2 = s.indexOf(ch);
while (p2 > -1) {
sb.append(s.substring(p1, p2));
p1 = p2 + 1;
p2 = s.indexOf(ch, p1);
}
if (p1 < s.length()) {
sb.append(s.substring(p1, s.length()));
}
return sb.toString();
}
答案 1 :(得分:1)
如果您真的想自己实现,可以使用Set
来包含要删除的字符集合。这是一个让你入门的模板:
public static String removeAllChars(String source, String charsString) {
HashSet<Character> chars = new HashSet<>();
for (int i = 0; i < charsString.length(); i++) {
chars.add(charsString.charAt(i));
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < source.length(); i++) {
// chars.contains(source.charAt(i)) is O(1)
// use this to determine which chars to exclude
}
return sb.toString();
}
答案 2 :(得分:1)
借助dimo的提示和帮助,我写了这个解决方案:
public static String removeAllChars(String src, String dst){
HashSet<Character> chars = new HashSet<>();
char[] dstCharArray=dst.toCharArray();
for (int i=0; i<dstCharArray.length; i++){
chars.add(dstCharArray[i]);
}
StringBuilder sb = new StringBuilder();
char[] srcCharArray = src.toCharArray();
for (int i=0; i<srcCharArray.length; i++){
if (!chars.contains(srcCharArray[i])){
sb.append(srcCharArray[i]);
}
}
return sb.toString();
}
答案 3 :(得分:0)
尝试使用它。
删除所有无数值
String str = "343.dfsdgdffsggdfg333";
str = str.replaceAll("[^\\d.]", "");
输出将为您提供“343.333”
如果您将来需要删除数字和特殊值,请尝试使用
String str = "343.dfsdgdffsggdfg333";
string = string.replace(/[^a-zA-Z0-9]/g, '');