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.
题意:找出一个字符串中最长的无重复字符的子串。
思路:
解法一:比较暴力的解法,枚举每一个字符,从这个字符开始遍历,标记遍历的每一个字符,直到有重复的字符出现,时间复杂度大约是O(len*256),因为每次重新枚举时都要清空一下标记数组。
C代码:
int max(int a,int b)
{
return a >= b ? a : b;
}
int lengthOfLongestSubstring(char* s) {
int len = strlen(s);
int ans = 0,cnt;
int i,j;
int vis[257];
for(i = 0; i < len; i++) {
cnt = 0;
memset(vis,0,sizeof(vis));
for(j = i; j < len; j++) {
if(vis[s[j]]) {
break;
}
else {
cnt++;
vis[s[j]] = 1;
}
}
ans = max(cnt,ans);
}
return ans;
}
Java代码:
class Solution {
public int lengthOfLongestSubstring(String s) {
int ans = 0,cnt = 0;
boolean[] vis = new boolean[150];
int len = s.length();
for(int i = 0; i < len; i++) {
cnt = 0;
Arrays.fill(vis, false);
for(int j = i; j < len; j++) {
if(vis[s.charAt(j)] == true) {
break;
}
else {
cnt++;
vis[s.charAt(j)] = true;
}
}
ans = Math.max(ans, cnt);
}
return ans;
}
}
解法二:用到了滑动窗口思想,维护一个窗口,在这个窗口内各个字符都不相同,每次在右边新加入一个字符时,判断窗口内是否有重复的字符,没有的话则加入,有的话就把窗口的最左端一直到重复的字符都去掉,记录窗口的最大值,时间复杂度为O(len)。
C代码:
int max(int a,int b)
{
return a >= b ? a : b;
}
int lengthOfLongestSubstring(char* s) {
int ans,left,i,len,vis[257];
len = strlen(s);
ans = 0;
left = -1;
memset(vis,-1,sizeof(vis));
for(i = 0; i < len; i++) {
if(vis[s[i]] > left) { //有重复
left = vis[s[i]];
}
ans = max(ans,i - left);
vis[s[i]] = i;
}
return ans;
}
Java代码:
public class Solution {
public int lengthOfLongestSubstring(String s) {
int ans = 0;
int[] vis = new int[257];
int len = s.length();
int left = -1;
Arrays.fill(vis,-1);
for(int i = 0; i < len; i++) {
if(vis[s.charAt(i)] > left) {
left = vis[s.charAt(i)];
}
ans = Math.max(ans,i - left);
vis[s.charAt(i)] = i;
}
return ans;
}
}