修剪一个字符串,其中包含< = 2个字符

时间:2011-01-20 11:42:31

标签: algorithm string

假设您有一个输入字符串:

"my name is vikas"

建议将算法修改为:

"name vikas"

这意味着删除长度为<=2或说k字符的字词,以使其成为通用字词。

5 个答案:

答案 0 :(得分:1)

迭代字符串的各个字符,保持字符串中的当前位置和“当前字”,累积所有当前长度为&gt; = k的字,从累积的字重新组合字符串?

此算法使用就地重写并最小化元素之间的副本数量:

    final int k = 2;

    char[] test = "     my name     is el   jenso    ".toCharArray();
    int l = test.length;
    int pos = 0;
    int cwPos = 0;
    int copyPos = 0;

    while (pos < l)
    {
        if (Character.isWhitespace(test[pos]))
        {
            int r = pos - cwPos;
            if (r - 1 < k)
            {
                copyPos -= r;
                cwPos = ++pos;
            }
            else
            {
                cwPos = ++pos;
                test[copyPos++] = ' ';
            }
        }   
        else
        {
            test[copyPos++] = test[pos++];
        }
    }

    System.out.println(new String(test, 0, copyPos));

答案 1 :(得分:1)

 "a short sentence of words" split ' ' filter {_.length > 2} mkString " "

(斯卡拉)

答案 2 :(得分:1)

我认为您可以在O(n)时间内就地执行此操作。迭代字符串,保持指向开始处理的单词的指针。如果您发现单词的长度大于k,则用该单词覆盖字符串的开头。这是一个C代码(假设每个单词在空间上都是分开的):

void modify(char *s, int k){

    int n = strlen(s);
    int j = 0, cnt = 0, r = 0, prev = -1;
    s[n++] = ' ';  // Setinel to avoid special case
    for(int i=0; i<n; i++){
        if(s[i] == ' '){
            if (cnt > k){
                if(r > 0) s[r++] = ' ';
                while(j < i) s[r++] = s[j++];
            }       
            cnt = 0;
        }
        else {
            if (prev == ' ') j = i;
            cnt++;
        }
        prev = s[i];
    }
    s[r] = '\0';
}
int main(){

    char s[] = "my name is vikas";
    modify(s, 2);
    printf("%s\n", s);
}

答案 3 :(得分:0)

这样的东西就足够了(时间复杂度是最佳的,我猜):

input
 .Split(' ')
 .Where(s => s.Length > k)
 .Aggregate(new StringBuilder(), (sb, s) => sb.Append(s))
 .ToString()

空间复杂性怎么样?好吧,这可以在O(k)中运行(当然,我们不能计算输入和输出的大小),如果你考虑一下。它不会在.NET中,因为Split会生成实际的数组。但您可以构建迭代器。如果你想象字符串只是字符上的迭代器,它将成为O(1)算法。

答案 4 :(得分:0)

<{>} split() " "并省略if length() <= 2