从String中删除单个字符

时间:2013-08-08 20:39:30

标签: string algorithm duplicate-removal

我想要一个算法从O(n)复杂度或更低的字符串中删除所有出现的给定字符? (它应该是INPLACE编辑原始字符串)

例如

String="aadecabaaab";

removeCharacter='a'

Output:"decbb"

7 个答案:

答案 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",""));
  }
}