文章--LeetCode算法--LongestSubstringWithoutRepeatingCharacters
LSWRC
问题描述
Given a string, find the length of the longest substring without repeating characters.
实例
Examples:
- Given "abcabcbb", the answer is "abc", which the length is 3.
- Given "bbbbb", the answer is "b", with the length of 1.
- Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be a substring, "pwke" is a subsequence and
not a substring.
解决思路
思路:其实只需要前面出现过的重复字符的下标即可算出此段不重复子段的长度,核心操作其实是向前检索重复字符。需要注意的是最后循环
完成后,需要再算一下没有计算的那段的长度,在这些子段中取最长的。
实现代码
package com.leetcode.play;
import java.util.HashMap;
import java.util.Map;
/**
* Given a string, find the length of the longest substring without repeating characters.
* Examples:
*
* Given "abcabcbb", the answer is "abc", which the length is 3.
* Given "bbbbb", the answer is "b", with the length of 1.
* Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be a substring, "pwke" is a subsequence and
* not a substring.
*/
public class LongestSubStringNoRept {
public static void main(String[] args) {
String s = "abcabcbb" ;
int i = lengthOfLongestSubstring(s);
System.out.println(i);
}
public static int lengthOfLongestSubstring(String s) {
char[] sc = s.toCharArray();
Map<Character, Integer> cm = new HashMap<Character, Integer>();
int j = 0, maxLen = 0;
for (int i = 0; i < sc.length; ++i) {
char cur = sc[i];
if (cm.containsKey(cur)) {
maxLen = Math.max(i - j, maxLen);
j = Math.max(j, cm.get(cur) + 1);
}
cm.put(cur,i);
}
return Math.max(sc.length - j, maxLen);
}
}