[LeetCode] Longest Substring Without Repeating Characters

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;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值