2017-07-13 61 views
0

私のような文字列を持っている:私は、この文字列のように同じ文字の最長のサブ文字列の長さを返すために私のプログラムは、(Dのサブの5 =長さ)を返す必要がありますしたいC++の文字列配列で文字の最長シーケンスを見つける方法(繰り返し)

をaabccdddddeeeacdd、

他の長さをである:

  • = 2,1
  • B = 1
  • C = 2,1
  • D = 5,2
  • e = 3

dの場合、最長の長さです。

マイコード:

#include<iostream> 
#include<string> 
#include<vector> 
#include<algorithm> 

using namespace std; 

int main(){ 
    char flag; 
    vector<int> v; 
    int init = 0,count; // init for checking first character in loop 
    string s = "aabbbcccdddddeeeaacc"; 
    count = 0; 
    for(int i=0;i<s.length();i++){ 
     if(init == 0){ 
      flag = s[i]; 
      count++; 
      init = 1; 
     } 
     else{ 
      if(s[i] == flag){ 
       count++; 
      } 

      else{ 
       flag = s[i]; 
       v.push_back(count); 
       count = 0; 
      } 
     } 
    } 

    cout<<*max_element(v.begin(),v.end()); 

    return 0; 
} 
+0

何かを考えてみましょうか? –

+0

あなたはこれまでに何を試しましたか?あなたの試みはどうやって働いたのですか?あなたの試みにはどんな問題がありますか?あなたは* [良い質問をする方法を読む](http://stackoverflow.com/help/how-to-ask)と、[最小限の、完全で証明可能な例(http: /stackoverflow.com/help/mcve)? –

+0

私はforループを実行した後、任意の文字が発生したら、フラグに一意の値を与え、他の文字が出現しない限りカウンタをインクリメントして配列に格納し、最大値を見つけます。 – BugAdder

答えて

1
#include<iostream> 
#include<string> 

using namespace std; 

int main(){ 
    int longest = 0; 
    string s = "aabbbcccdddddeeeaacc"; 
    for(int i=0; i<s.length();){ 
     char current = s[i]; 
     int currLen = 0; 
     for(;i<s.length() && current == s[i]; ++i) 
      ++currLen; 
     if(currLen > longest) 
      longest = currLen ; 
    } 

    cout<<longest; 

    return 0; 
} 

これは少し単純なアプローチです。

サイドローに - regexを試しましたか?このような簡単な何か(.)\1+あなたのためのすべての仕事を行うことができます。それを確認してくださいhere

+0

これはうまくいくようですが、その効率は確かですか?あなたは2つのループを使用していますが、それは小さくて簡単だと私は正規表現をCで使用することができます+ + ?? – BugAdder

+0

私は正規表現をC++で使用していません。 – BugAdder

+2

これは2つのループではありません。ステートメントの場合は2ですが、文字列に対する1回の反復の2つの部分に過ぎないので、基本的には1つのループです。 –

-1

このソリューションは、動作しているようです、

#include<iostream> 
#include<string> 
#include<vector> 
#include<algorithm> 

using namespace std; 

int main(){ 
    char flag; 
    vector<int> v; 
    int init = 0,count; // init for checking first character in loop 
    string s = "aaaaaaabbbcccddddddeeeaacc"; 
    count = 0; 
    for(int i=0;i<s.length();i++){ 
     if(init == 0){ 
      flag = s[i]; 
      count++; 
      init = 1; 
     } 
     else{ 
      if(s[i] == flag){ 
       count++; 
      } 

      else{ 
       flag = s[i]; 
       v.push_back(count); 
       count = 1; 
      } 
     } 
    } 

    cout<<*max_element(v.begin(),v.end()); 

    return 0; 
} 

私はこのアプローチを最適化するために何か、 を行うことができ、私はbestStartと
@MichaelGearyソリューションを実装しようとすると、終わりすぎ。 この助けを借りてくれてありがとう。

編集:配列のない

#include<iostream> 
#include<string> 

using namespace std; 

int main(){ 
    char flag; 
    int max; 
    int init = 0,count; // init for checking first character in loop 
    string s = "aaaaaaabbbcccddddddeeeeeeeeeeaacc"; 
    count = 0; 
    max = 0; 
    for(int i=0;i<s.length();i++){ 
     if(init == 0){ 
      flag = s[i]; 
      count++; 
      init = 1; 
     } 
     else{ 
      if(s[i] == flag){ 
       count++; 
      } 

      else{ 
       flag = s[i]; 
       if(count > max){ 
        max = count; 
       } 
       count = 1; 
      } 
     } 
    } 

    cout<<max; 

    return 0; 
} 

このソリューションは、提案のために、 おかげ@GauravSehgalを動作するようです:)

+0

配列にcountを格納する必要はありません。移動中に見つかった最大の 'count'をちょうど保存してください。 –

+0

@ Gaurav Sehgal提案してくれてありがとうございました:)正常に動作しているようです。 – BugAdder

+0

コードの境界線を常にテストします。たとえば、最後のグループはカウントされません。 –

関連する問題