题目来源:https://leetcode.com/problems/longest-substring-without-repeating-characters/
问题描述
3. Longest Substring Without Repeating Characters
Medium
Given a string, find the length of the longest substring without repeating characters.
Example 1:
Input: "abcabcbb"
Output: 3
Explanation: The answer is "abc", with the length of 3.
Example 2:
Input: "bbbbb"
Output: 1
Explanation: The answer is "b", with the length of 1.
Example 3:
Input: "pwwkew"
Output: 3
Explanation: 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.
------------------------------------------------------------
题意
给定一个字符串s,求最长的不包含重复字符的子串。
------------------------------------------------------------
思路
用sub[i] (i=0,1,…,n-1)表示以s[i]开头的最长的不包含重复字符的子串的长度。对于每个sub[i],用一个HashSet记录出现过的字符,如果重复,则停止遍历。
记s的长度为n,则一共有n个sub[i], 每个sub[i]的计算,最多要遍历n个字符,HashSet每次存取O(1),最多n次HashSet存取O(n). 总复杂度为O(n^2).
------------------------------------------------------------
代码
class Solution {
// sub[i]: length of longest substring begin with i
public int lengthOfLongestSubstring(String s) {
int n = s.length(), i, j, submax = 0;
char ch;
int []sub = new int[n];
HashSet<Character> cset = new HashSet<Character>();
for (i=0; i<n; i++)
{
cset.clear();
for (j=i; j<n; j++)
{
ch = s.charAt(j);
if (!cset.contains(ch))
{
cset.add(ch);
sub[i]++;
}
else
{
break;
}
}
}
for (i=0; i<n; i++)
{
submax = sub[i]>submax? sub[i]:submax;
}
return submax;
}
}