请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
数据范围:
"abcabcbb"
3
因为无重复字符的最长子串是"abc",所以其长度为 3。
"bbbbb"
1
因为无重复字符的最长子串是"b",所以其长度为 1。
"pwwkew"
3
因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是子串的长度,"pwke" 是一个子序列,不是子串。
public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @return int整型 */ public int lengthOfLongestSubstring (String s) { // write code here if (s.length() == 0 && s.equals(" ")) return 0; int currentLen = 0; int maxLen = 0; char[] chars = s.toCharArray(); HashMap<Character, Integer> map = new HashMap<>(); for (int i = 0; i < chars.length; i++) { if (map.containsKey(chars[i])){ int d=i-map.get(chars[i]); if (d>currentLen) currentLen++; else currentLen=d; }else { currentLen++; } if (currentLen>maxLen) maxLen=currentLen; map.put(chars[i],i); } return maxLen; } }
import java.util.*; public class Solution { public int lengthOfLongestSubstring (String s) { // 定义最大长度 int max=0; // 定义start指针,初始值为-1是考虑到length=1的输入 int start=-1; // 定义hashmap,key为字符,value为最后一次出现的位置 HashMap<Character,Integer> map = new HashMap<>(); // 遍历字符串 for(int i=0;i<s.length();i++){ char cur = s.charAt(i); // 只有当重复元素出现在start后方时,才更新start(避免start向前更新) if(map.containsKey(cur) && map.get(cur) > start){ start = map.get(cur); } // 实时更新map map.put(cur,i); // 更新最大长度 max = Math.max(max, i-start); } // 返回最大长度 return max; } }
from queue import deque class Solution: def lengthOfLongestSubstring(self , s: str) -> int: if not s: return 0 q = deque() # 初始无重复最长子串长度 max_substr = 0 for i in s: if i not in q: q.append(i) # 更新max_substr if len(q) > max_substr: max_substr = len(q) else: # 从队列中弹出重复元素i以及i之前的所有元素 while i in q: q.popleft() # 弹出之后将i入队 q.append(i) return max_substr
public int lengthOfLongestSubstring(String s) { int b = 0; int key = 0; List<Character> res = new ArrayList<>(); while (b != s.length()) { if (res.contains(s.charAt(b))){ List<Character> code = new ArrayList<>(); for (Character re : res) { if (re == s.charAt(b)) { code.add(re); break; } else code.add(re); } res.removeAll(code); res.add(s.charAt(b)); b++; }else { res.add(s.charAt(b)); b++; } key = Math.max(key,res.size()); } return key; }
public int lengthOfLongestSubstring(String s) { // write code here // 典型的额双指针问题 int len = s.length(); if(len <= 1) return s.length(); int maxLen = 0; ArrayList<Character> charList = new ArrayList<>(); for (int i = 0; i < len; i++) { for (int j = i; j < len; j++) { char c = s.charAt(j); if(!charList.contains(c)) charList.add(c); else { maxLen = Math.max(maxLen, charList.size()); charList.clear(); break; } } } return maxLen; }
public int lengthOfLongestSubstring(String s) { // write code here int len = 0; int[] hash = new int[256]; int j = 0; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); hash[c]++; // 初始化时,每个元素对应 ASCII 的数字的值为 1 while (hash[c] > 1) { // 发现有重复的字符串 // 寻找重复元素的下一个下标,退出就是为 j hash[s.charAt(j)] --; j++; } // 当前的最大值 len = Math.max(i - j + 1, len); // 继续往下寻找... } return len; }
package main /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @return int整型 */ func lengthOfLongestSubstring(s string) int { // write code here var char2Index = make(map[int32]int, len(s)) var maxSub = 0 var currentSubLen = 0 var getMax = func(a, b int) int { if a > b { return a } return b } var left int for index, char := range s { if charIdx, exist := char2Index[char]; exist { if charIdx < left { currentSubLen += 1 } else { maxSub = getMax(currentSubLen, maxSub) currentSubLen = index - charIdx left = charIdx + 1 } } else { currentSubLen += 1 } char2Index[char] = index } maxSub = getMax(currentSubLen, maxSub) return maxSub }
function lengthOfLongestSubstring(s) { // write code here if (!s) return 0; let dic = new Map(); let dp = [1]; let m = 1; dic.set(s[0], 0); for (i = 1; i < s.length; i++) { let j = dic.get(s[i]); dp[i] = j === undefined || dp[i - 1] < i - j ? dp[i - 1] + 1 : i - j; dic.set(s[i], i); m = Math.max(m, dp[i]); } return m; }
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @return int整型 */ #include <string.h> #define max(x,y)((x)>(y)?(x):(y)) int lengthOfLongestSubstring(char* s ) { // write code here int len = strlen(s); //appear数组类似于哈希表 appear[s[i]]存放每个字符出现过的次数 //s[i]是字符 如abcab s[0]==s[3]=='a' //不难发现 appear[s[0]]==appear[s[3]]==appear['a'] int appear[10000] = {0}; //ans保存最大长度 int ans = 0; //i和j是不含重复字符的子字符串的首尾指针 for (int i=0, j=0; j<len; j++) { //尾指针j开始扫描 字符出现就次数+1 appear[s[j]]++; //存在重复出现的字符 //如abcab appear[s[0]]==appear[s[3]]==appear[a] while (i<j && appear[s[j]]>1) { //重复出现的字符 出现次数-1 appear[s[i]]--; //首指针i向后移动一位 i++; } //ans取ans和每次子串长度的最大值 ans = max(ans, j-i+1); } return ans; }
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @return int整型 */ int lengthOfLongestSubstring(string s) { // 时间复杂度O(N),空间复杂度O(N) unordered_set<char> hash; int left = 0, right = 0, res = 0; while (right < s.size()) { while (hash.find(s[right]) != hash.end()) { hash.erase(s[left]); ++left; } hash.insert(s[right]); ++right; res = max(res, right - left); } return res; } };
public int lengthOfLongestSubstring(String s) { // 记录字符上一次出现的位置 int[] last = new int[128]; for (int i = 0; i < 128; i++) last[i] = -1; int start = 0; int res = 0; for (int i = 0; i < s.length(); i++) { int index = s.charAt(i); // 控制窗口开始位置 start = Math.max(start, last[index] + 1); // 判断哪个窗口更长 res = Math.max(res, i - start + 1); // 记录出现位置 last[index] = i; } return res; }
public int lengthOfLongestSubstring (String s) { // write code here HashMap<Character, Integer> map = new HashMap<>(); int res = 0; int l = 0; for (int i = 0; i < s.length(); i++) { if (map.containsKey(s.charAt(i))) { map.put(s.charAt(i), map.get(s.charAt(i)) + 1); } else { map.put(s.charAt(i), 1); } //重复了就一直移动左边界 直到不重复 while (map.get(s.charAt(i)) > 1) { map.put(s.charAt(l), map.get(s.charAt(l)) - 1); l++; } res = Math.max(res, i - l + 1); } return res; } }
public int lengthOfLongestSubstring (String s) { int max=0; int start=0; char[] chars = s.toCharArray(); Set<Character> set = new HashSet<>(); for (int end = 0; end < chars.length; end++) { while (set.contains(chars[end])){ set.remove(chars[start]); start++; } set.add(chars[end]); max=Math.max(max,end-start+1); } return max; }
public int lengthOfLongestSubstring (String s) { // write code here int max = 0; boolean[] sign = new boolean[256]; int left = 0, right = 0; while (right < s.length()) { char ch = s.charAt(right); if (sign[ch]) { while (s.charAt(left) != ch) { sign[s.charAt(left ++)] = false; } sign[s.charAt(left ++)] = false; } sign[ch] = true; right ++; max = Math.max(max, right - left); } return max; }
class Solution: def lengthOfLongestSubstring(self , s: str) -> int: if not s: return 0 max_len = 1 left_index = 0 left_start_index = 0 _list = s[left_index] for i in range(1, len(s)): if s[i] not in _list: _list = s[left_start_index : i + 1] if len(_list) > max_len: max_len = len(_list) else: left_index = left_start_index + _list.find(s[i]) + 1 left_start_index = left_index _list = s[left_index : i + 1] return max_len
package main /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 动态规划 * @param s string字符串 * @return int整型 */ func lengthOfLongestSubstring(s string) int { // write code here if len(s) == 0 { return 0 } // dp[i] 表示以 s[i] 结尾的最长无重复子串长度 dp := make([]int, len(s)) // lastIndex 记录字符上一次出现的位置 lastIndex := make(map[byte]int) dp[0] = 1 // 第一个字符子串长度为1 lastIndex[s[0]] = 0 // 记录第一个字符的位置 maxLen := 1 // 记录全局最长子串长度 for i := 1; i < len(s); i++ { lastPos, found := lastIndex[s[i]] if found && lastPos >= i-dp[i-1] { // 如果字符在 dp[i-1] 子串内出现过 dp[i] = i - lastPos } else { // 如果没有出现过或者不在 dp[i-1] 子串内 dp[i] = dp[i-1] + 1 } // 更新字符位置 lastIndex[s[i]] = i // 更新最大长度 if dp[i] > maxLen { maxLen = dp[i] } } return maxLen }
public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @return int整型 */ public int lengthOfLongestSubstring (String s) { // write code here if(s == null){ return 0; } Set<Character> distinct = new HashSet<>(); int slow = 0; int fast = 0; int longest = 0; while (fast < s.length()) { if (distinct.contains(s.charAt(fast))) { distinct.remove(s.charAt(slow)); slow++; //↑可合并为distinct.remove(s.charAt(slow++)); } else { distinct.add(s.charAt(fast)); fast++; //↑可合并为distinct.add(s.charAt(fast++)); longest = Math.max(longest, fast - slow); } } return longest; } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @return int整型 */ public int lengthOfLongestSubstring (String s) { int n = s.length(); Map<Character, Integer> map = new HashMap<>(); int res = 0; int i = 0; for (int j = 0; j < n; j++) { char ch1 = s.charAt(j); map.put(ch1, map.getOrDefault(ch1, 0) + 1); if (map.size() == j - i + 1) { res = Math.max(res, j - i + 1); } if (map.size() < j - i + 1) { char ch2 = s.charAt(i); map.put(ch2, map.get(ch2) - 1); if (map.get(ch2) == 0) { map.remove(ch2); } i++; } } return res; } }