[アルゴリズムトピックのブレークスルー] ダブルポインター - 繰り返し文字を含まない最長の部分文字列 (10)

目次

1. 質問分析

2. アルゴリズム原理

3. コードの書き方

最後に次のように書きます。


1. 質問分析

質問リンク: 3. 繰り返し文字を含まない最長の部分文字列 - Leetcode

 この質問は理解するのが難しくありません。文字が繰り返されていない最長の部分文字列を見つけるというものです。

最後に、最長の部分文字列の長さを返します。

2. アルゴリズム原理

最初に思い浮かぶのは、もちろん総当たりの解決策で、0 の状況に一致するすべての部分文字列を列挙するだけです。

しかし、それを最適化する方法があるはずです。ほとんどの場合、ブルート フォースを使用するとタイムアウトになりますが、これは面白くありません。最適化する方法を見てみましょう:

 スライディング ウィンドウを使用してブルート フォース ソリューションを最適化できます。

まず、ハッシュ テーブルに文字を入れるための 2 つのポインタを定義します。繰り返し文字が出現する場合は、繰り返し文字がなくなるまでウィンドウが表示されます。

次に、ハッシュ テーブルへの文字の入力を続け、部分文字列の最大長を記録し、最後に次の値を返します。

3. コードの書き方

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int len = 0;
        unordered_set<char> win;
        for(int left = 0, right = 0; right < s.size(); right++) {
            while(win.find(s[right]) != win.end()) {
                win.erase(s[left]);
                left++;
            }
            len = max(len, right - left + 1);
            win.insert(s[right]);
        }
        return len;
    }
};

最後に次のように書きます。

以上がこの記事の内容です、読んでいただきありがとうございます。

何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。

記事の内容に漏れや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメント欄で指摘してください〜

おすすめ

転載: blog.csdn.net/Locky136/article/details/131676357