⼀文字列を与えられた、あなたは文字サブメニューの最も長い文字列の繰り返し長さを含んでいないかを調べます。
例1インジケータ:
入力:「abcabcbb」
出力:3
説明:繰り返しのない文字の最長のサブストリングが「ABC」であるため、その長さは3ですので。
例2インジケーター:
入力:「BBBBB」
出力:1つの
説明:その長さが1になるように最長のストリングは、「B」せずに文字を繰り返しているため。
インジケータ例3:
入力:「pwwkew」
出力:3
説明:その長さは3であるので、最長のサブ文字列は、「WKE」せずに文字を繰り返しているため。
あなたの答えは、長さの部分文字列でなければならないことに注意してください、「pwkeは」サブシーケンスではなく、部分文字列です。
問題解決のアイデア:
アレイを作成し、0に初期化され、アレイ256個の要素の総数、配列添字は、ASCIIコードの文字を表します。初めからトラバーサル文字列、文字、レコーディング規格は、文字列内の(開始位置に対して)文字の位置をオフセット配列要素内の文字があります。文字配列要素のインデックス値が0で見つかった文字列を横断すると、それは文字が見られなかったことを意味し、これは、文字列が(文字は最長サブ表さない最長のサブストリングの開始位置を探して、左を表します開始位置の文字列)。文字配列要素のインデックス値は、左又は未満の値は、非反復文字の長さが(最大長さの値は、文字-left +を横切る電流オフセット値を最大保存されたされたときに0に見られる文字列を横断するとき1)。
1つの#include < ストリング >
2の#include <iostreamの>
3 使用して 名前空間STDを、
4 int型 lengthOfLongestSubstring(ストリングS)
5 {
6 int型 M [ 256 ] = { 0 }、RESが= 0、左= 0 。
7 ためには(int型、I = 0 ; iが(s.sizeを<); ++ i)の
8 {
9 もし(m個の[S [I]] == 0 || M [S [I] < 左)
10 {
11 =最大解像度(RES、私は- +左1 )。
12 }
13 他の
14 {
15が 左=のM [S [I]]。
16 }
17 M [S [I] = I + 1 。
18 }
19の リターンRES。
20 }
21 のint main()の
22 {
23 列のMyString。
24 一方、(1 )
25 {
26 CIN >> のMyString。
27 もし(mystring.compare(" 終了")== 0 )
28 {
29 BREAK ;
30 }
31は COUT << " 反復文字なしの最大長さ:" << lengthOfLongestSubstring(のMyString)<< ENDL;
32 }
33れる 戻り 0 ;
34れます }
プログラム文が、なぜ<左の[i]を[s]は、条件のmが存在しなければならない場合は入力文字列が「abbca」の時間であれば、ときに私= 4、我々はされようとしている、説明するために例を使用します最後の文字の開始を横断する、下付き文字は4に対応するC、3に対応するB、1に対応する、この時点で配列要素の値は、左2、すなわち第2の現在の最長のストリングの左境界B位置、及び現在最も長い文字列の範囲内の最初ではないが、新しい着信のI = 4の場合、結果は、添加すべきたが、今回は、ハッシュテーブルを更新されません1、0でない、そしてそれは、次に、決定関係、残っていない場合、結果は[i]は、S <左m追加する必要があり、その後、答えは少しなり、更新することができません。