文字を繰り返さずに最長の部分文字列の問題を説明する

文字を繰り返さずに最長の部分文字列の問題を説明する

タイトル説明:

文字列が与えられると、繰り返される文字の最長の部分文字列の長さが含まれていないことがわかります

例:

例1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

例2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

例3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

解決策:
高速および低速のポインターとHashMapを使用して、線形時間計算量を実現します。次の方法を理解するために最も重要なことは、それらを使用する目的を理解することです。
フローチャート:

ここに画像の説明を挿入

ソースコード:

class Solution {
    
    
    public int lengthOfLongestSubstring(String s) {
    
    
         //创建HashMap,Key用来存字符,Value用来存当前位置
        HashMap<Character,Integer> map = new HashMap<>();
        int max = 0;

        //利用快慢指针从头开始扫描
        for (int i = 0, j = 0; j < s.length(); j++) {
    
    
            //map中存在这个字符
            if (map.containsKey(s.charAt(j))) {
    
    
                //如果之前出现过这个字符,变换慢指针i的位置
                //要么不变,要么与之相同的且在前面出现过的字符后一个的位置
                i = Math.max(i,map.get(s.charAt(j)) + 1);
            }
            //将新的字符存入map中
            map.put(s.charAt(j),j);
            max = Math.max(max,j - i + 1);
        }
        return max;
    }
}

おすすめ

転載: blog.csdn.net/weixin_44829930/article/details/109896460