我想要一个算法从O(n)复杂度或更低的字符串中删除所有出现的给定字符? (它应该是INPLACE编辑原始字符串)
例如
String="aadecabaaab";
removeCharacter='a'
Output:"decbb"
答案 0 :(得分:3)
享受算法:
j = 0
for i in length(a):
if a[i] != symbol:
a[j] = a[i]
j = j + 1
最终化:
length(a) = j
答案 1 :(得分:1)
严格来说,您无法从String
中删除任何内容,因为String
类是不可变的。但您可以构建另一个String
,其中包含原始String
中的所有字符,但“要删除的字符”除外。
创建StringBuilder
。遍历原始String
中的所有字符。如果当前字符不是要删除的字符,则将其附加到StringBuilder
。循环结束后,将StringBuilder
转换为String
。
答案 2 :(得分:1)
你不能使用String
来实现它,因为它是不可变的,但这是一个O(n)算法,用char[]
来实现它:
char[] chars = "aadecabaaab".toCharArray();
char removeCharacter = 'a';
int next = 0;
for (int cur = 0; cur < chars.length; ++cur) {
if (chars[cur] != removeCharacter) {
chars[next++] = chars[cur];
}
}
// chars[0] through chars[4] will have {d, e, c, b, b} and next will be 5
System.out.println(new String(chars, 0, next));
答案 3 :(得分:0)
是的。在线性时间内,迭代字符串,使用.charAt()进行检查(如果这是removeCharacter),不要将其复制到新字符串。如果不是,请复制。就是这样。
答案 4 :(得分:0)
这可能不应该有“java”标记,因为在Java中,String是不可变的,你不能在适当的位置编辑它。对于更一般的情况,如果您有一个字符数组(使用任何编程语言)并且您希望在不创建另一个数组的情况下“就地”修改数组,那么使用两个索引就足够了。一个遍历数组中的每个字符,另一个字符从开头开始,只有当您看到一个不是removeCharacter的字符时才会递增。由于我认为这是一项家庭作业,我会将其留在那里,让你弄清楚细节。
答案 5 :(得分:0)
使用哈希表来保存要删除的数据。记录N复杂性。
std::string toRemove = "ad";
std::map<char, int> table;
size_t maxR = toRemove.size();
for (size_t n = 0; n < maxR; ++n)
{
table[toRemove[n]] = 0;
}
然后解析整个字符串并在命中时删除(thestring是一个数组):
size_t counter = 0;
while(thestring[counter] != 0)
{
std::map<char,int>::iterator iter = table.find(thestring[counter]);
if (iter == table.end()) // we found a valid character!
{
++counter;
}
else
{
// move the data - dont increment counter
memcpy(&thestring[counter], &thestring[counter+1], max-counter);
// dont increment counter
}
}
编辑:我希望这不是技术测试或类似的事情。 = S
答案 6 :(得分:0)
import java.util.*;
import java.io.*;
public class removeA{
public static void main(String[] args){
String text = "This is a test string! Wow abcdefg.";
System.out.println(text.replaceAll("a",""));
}
}