題目:
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。
示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "abc",所以其長度爲 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因爲無重複字符的最長子串是 "b",所以其長度爲 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "wke",所以其長度爲 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
思路: 用兩個下標 i 與 j ,表示子串的首尾,初始化 i =0 ,j = 0 ,定義一個Map 結構,用於存放字符出現的位置
1、如果 j 指向的字符 x 是個新字符,則存放於 Map 結構中,key爲字符x ,value 爲 字符x的下標
2、如果字符 x 已存在於map結構中,則取出字符x 在Map 結構中的value值 xi
若 xi > i ,則更新 i = xi
否則 i 值不變
Java代碼如下
public int lengthOfLongestSubstring(String s) {
Map<Character,Integer> map = new HashMap<>();
if(s.length()<=1){
return s.length();
}
int i = 0;
int j = 0;
int max = 0;
while (j<s.length()){
if(!map.containsKey(s.charAt(j))){ //如果是個新的字符,則放入map結構中
map.put(s.charAt(j),j);
}else { //如果字符 x 已存在,則判斷字符 x 存在的下標 xi 是否大於子串首下標 i ,若是大於 更新i 爲xi ,否則不更新 i的值
i = i<(map.get(s.charAt(j)) + 1)?(map.get(s.charAt(j)) + 1):i;
map.put(s.charAt(j),j);
}
max = max<(j-i+1)?(j-i+1):max;
System.out.println("i = "+i+" , j = "+j);
j++;
}
return max;
}