重複文字なしの最上位列(スライドウィンドウ)


文字列を指定すると、重複文字が含まれていない長男の列の長さを見つけてください.
入力:“abcabcbb”出力:3解釈:重複文字のない最長男列は“abc”であるため、その長さは3である.
リストの使用
リストを使う場合は一番長い文字列を保存できますが、この問題は一番長い文字列を返す必要はありませんので、リストはよくありません
class Solution {
    public int lengthOfLongestSubstring(String s) {
    //      ,     0
        int max = 0;
        char[] chars = s.toCharArray();
        //      list,
        List arrayList = new LinkedList();
        for (char c : chars) {
            if (arrayList.contains(c)) {
                int pre = arrayList.indexOf(c);
                //subList,    ,         
                arrayList=arrayList.subList(pre + 1, arrayList.size());
                arrayList.add(c);
            } else {
                arrayList.add(c);
                max = Math.max(max, arrayList.size());
            }

        }
        return max;
    }
}

HashMap
文字列を返す必要はないのでmap、keyは文字、valueは文字が存在するインデックスの次の値を使用します.
  • startは文字列の起点であり、endはサブ列の重点であり、endは文字列全体
  • をまっすぐ歩いている.
  • の後に前の文字と重複するとstartは重複する文字の次から文字列
  • を再構築する.
  • hashmapのkey値は一意の
  • である
    class Solution {
       public int lengthOfLongestSubstring(String s) {
           int n = s.length(), ans = 0;
           //    map
           Map<Character, Integer> map = new HashMap<>();
           for (int end = 0, start = 0; end < n; end++) {
               char alpha = s.charAt(end);
               if (map.containsKey(alpha)) {
                   start = Math.max(map.get(alpha), start);
               }
               ans = Math.max(ans, end - start + 1);
               //hashmap  key     
               map.put(s.charAt(end), end + 1);
           }
           return ans;
       }
    }