package jianzhioffer;

import java.util.HashMap;
import java.util.Map;

public class test48 {
    public static void main(String[] args) {
        String s="pwwkew";
        System.out.println(lengthOfLongestSubstring(s));
    }
    public static int lengthOfLongestSubstring(String s) {
       //优化
        if(s==null||s.length()==0){
            return 0;
        }
        //用动态规划dp[j]表示j位置结尾的最长子字符串长度
        //i位置表示最近的和j重复的字母位置,也就是s[i]=s[j]
        //i=-1,表示前面没有重复的,dp[j]=dp[j-1]+1;
        //dp[j-1]<j-i,,i在j-1外面,dp[j]=dp[j-1]+1
        //dp[j-i]>=j-i说明字符 s[i]s[i] 在子字符串 dp[j-1]dp[j−1] 区间之中 ,则 dp[j]dp[j] 的左边界由 s[i]s[i] 决定,
        //即 dp[j] = j - i ,比如pwwd,第二个w时候

           
        Map<Character, Integer> dic = new HashMap<>();
        int res = 0, tmp = 0;
        for(int j = 0; j < s.length(); j++) {
            int i = dic.getOrDefault(s.charAt(j), -1); // 获取索引 i
            dic.put(s.charAt(j), j); // 更新哈希表
            tmp = tmp < j - i ? tmp + 1 : j - i; // dp[j - 1] -> dp[j]
            res = Math.max(res, tmp); // max(dp[j - 1], dp[j])
        }
        return res;

            
     


       
        //笨方法
        // int max=0;
        // for(int i=0;i<s.length();i++){
        //     int x=helper(i,s,new ArrayList<Character>());
        //     if(max<x){
        //         max=x;
        //     }
        //     if(max==s.length()){
        //         return max;
        //     }
        //     if(max>=(s.length()-i+1)){
        //         return max;
        //     }
        // }
        // return max;
        
    }
    // public static int helper(int start,String s,List<Character> temp){
    //     for(int i=start;i<s.length();i++){
    //         char x=s.charAt(i);
    //         if(temp.size()==0){
    //             temp.add(x);
    //         }else if(!temp.contains(x)){
    //             temp.add(x);
    //         }else{
    //             return temp.size();
    //         }
    //     }
    //     return temp.size();

    // }
    
}