Longest Substring Without Repeating Characters(最长的子串不重复字符)
题目要求:给定一个字符串,找到最长的子字符串的长度,要求不重复字符。
例如:
给定一个字符串“abcabcbb”,答案是“abc”,长度是3。
给定一个字符串“bbbbb”,答案是“b”,长度是1。
给定一个字符串“pwwkew”,答案是“wke”,长度是3。
注意:答案必须是一个子字符串,“pwke”是一个子序列,而不是一个子字符串。
解法一:
思路:基本思想为建立一个散列表来存储字符串中的字符。以字符为键,字符所处位置为值。设置两个值start,end来扫描字符串,同时更新散列表。如果该字符已经存在于散列表中,则更新start值,将start值赋值为最后找到的同一个字符的右侧。
1 public class LongestSubstringWithoutRepeatingCharacters { 2 3 public static void main(String[] args) { 4 Scanner scanner = new Scanner(System.in); 5 String string = scanner.nextLine(); 6 System.out.println("最长不重复子串的长度为:" + lengthOfLogestSubstring(string)); 7 } 8 9 10 public static int lengthOfLogestSubstring(String s) { 11 int max = 0; 12 Map<Character, Integer> map = new HashMap<>(); 13 for (int start = 0,end = 0; end < s.length(); end++) { 14 if (map.containsKey(s.charAt(end))) { 15 start = Math.max(start, map.get(s.charAt(end))+1); 16 } 17 map.put(s.charAt(end), end); 18 max = Math.max(max, end-start+1); 19 } 20 return max; 21 } 22 }