2011-01-20 19 views
0

あなたが入力文字列を与えていると仮定しますk文字を使用して、一般的にします。<=と文字列をトリミング2つの文字

+0

:ここではCのコードでは、(それが各単語をスペースでexaclyによって分離されていることを前提として)です。言語にとらわれないほどのものではありません。 – marcog

+0

@Colin [宿題タグを追加するために質問を編集しないでください。疑いの余地があるなら、それをそのまま残すことが最善です。代わりに、最初に、質問者が状況を明らかにするように要請するコメントを追加してください。](http://meta.stackexchange.com/questions/10811/how-to-ask-and-answer-homework-questions) – marcog

+0

@marcog:それは本当に宿題の質問ではありません。この質問は私が気付いたときに私が気づいたときに、あるフォーラムに質問をしたときに、アドレスバーにリンクを張るのに適した文字列をトリムするので、私はそのアプローチについて考え始めました。質問。 – Vikas

答えて

1

私はあなたがO(n)時にその場でこれを行うことができると思います。あなたが処理している単語の先頭にポインタを置いて、文字列を繰り返します。単語の長さがkより大きい場合は、文字列の先頭をこの単語で上書きします。最良の答えは言語に依存することになるだろう

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); 
} 
1

文字列の現在の位置と "現在の単語"を保持し、現在のすべての単語を長さ> = kで累積し、累積された単語から文字列を再構成しますか?

このアルゴリズムは書き換えインプレース使用し、要素間のコピーの数最小限に抑えること:何

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

:そのようなことで十分であろうが(時間計算量が最適である、私は推測)

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)); 
+0

@eljenso:これはO(n)空間アプローチのようです。余分なスペースがあれば何かを提案してください。 – Vikas

+0

ここでは単語の定義が重要です。 '、'はどう? –

+1

長さ eljenso

0

を空間の複雑さについて?もちろん、これはO(k)で実行できます(入力と出力のサイズを数えることはできません)。 Splitは実際の配列を作るので、.NETではそうはなりません。しかし、代わりにイテレータを構築することができます。そして文字列が文字の反復子であると想像すれば、O(1)アルゴリズムになります。

0

" "によってsplit()if length() <= 2

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

(スカラ)を省略

関連する問題