题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例
输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
题目要求
int lengthOfLongestSubstring(char * s){ }
题解
1 int max(int a,int b){ 2 return a>b?a:b; 3 } 4 5 int lengthOfLongestSubstring(char * s){ 6 int len=strlen(s); 7 if(len<2)return len; 8 int m=1,ch=s[0],p=0; 9 for(int i=1;i<len;i++){ 10 for(int j=p;j<i;j++){ 11 if(s[j]==s[i]){ 12 m=max(m,i-p); 13 p=j+1; 14 } 15 } 16 } 17 m=max(m,len-p); 18 return m; 19 }
要周到地考虑各种情况,比如字符串为空,字符无重复等。
用哈希会比较快。
下面是别人用哈希的代码
1 int lengthOfLongestSubstring(char * s){ 2 int start = 0, end = 0, maxlen = 0; 3 char map[256] = {0}; 4 map[(int)*(s+start)] = 1; 5 6 while( *(s+end) != 0 ) 7 { 8 maxlen = maxlen>(end-start+1)?maxlen:(end-start+1); 9 ++end; 10 while( 0 != map[ (int)*(s+end) ] )//将要加入的新元素与map内元素冲突 11 { 12 map[ (int)*(s+start) ] = 0; 13 ++start; 14 } 15 map[(int)*(s+end)] = 1; 16 } 17 18 return maxlen; 19 }
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
原文地址:https://www.cnblogs.com/shi-champion/p/11706280.html
时间: 2024-10-10 04:35:00