假设您有一个输入字符串:
"my name is vikas"
建议将算法修改为:
"name vikas"
这意味着删除长度为<=2
或说k
字符的字词,以使其成为通用字词。
答案 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