重複文字なしの最上位列(スライドウィンドウ)
9008 ワード
文字列を指定すると、重複文字が含まれていない長男の列の長さを見つけてください.
入力:“abcabcbb”出力:3解釈:重複文字のない最長男列は“abc”であるため、その長さは3である.
リストの使用
リストを使う場合は一番長い文字列を保存できますが、この問題は一番長い文字列を返す必要はありませんので、リストはよくありません
HashMap
文字列を返す必要はないのでmap、keyは文字、valueは文字が存在するインデックスの次の値を使用します. startは文字列の起点であり、endはサブ列の重点であり、endは文字列全体 をまっすぐ歩いている.の後に前の文字と重複するとstartは重複する文字の次から文字列 を再構築する. hashmapのkey値は一意の である
入力:“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は文字が存在するインデックスの次の値を使用します.
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;
}
}