给定一个字符串,请找出其中长度最长且不含有重复字符的子串,计算该子串长度。
数据范围:输入的字符串长度满足 ,字符串中仅包含小写的英文字母
s = input() dp = [1]*len(s) for i in range(1,len(s)): temp = s[i-dp[i-1]:i] if s[i] not in temp: dp[i]=dp[i-1]+1 else: index = temp.index(s[i]) dp[i] = i-(index+i-dp[i-1]) print(max(dp))
#include <bits/stdc++.h> using namespace std; int main() { string s,res=""; cin>>s; unordered_map<char, int> h; int max = 0,j=0,i=0; while(i<s.size()&&j<s.size()) { if(h[s[j]]==0) { h[s[j]]=1; j++; if(max<=(j-i)) max=j-i; } else { h[s[i]]=0; i++; } } cout<<max<<endl; return 0; }
import java.util.*; public class Main{ public static void main(String []args){ Scanner in=new Scanner(System.in); String s=in.nextLine(); System.out.println(Len(s)); } public static int Len(String s){ if(s.length()==0){ return 0; } int max=0; int from=0; for(int i=0;i<s.length();i++){ for(int j=from;j<i;j++){ if(s.charAt(i)==s.charAt(j)){ from=j+1; } } if(i+1-from>max){ max=i+1-from; } } return max; } }
#include <iostream> #include <algorithm> #include <vector> using namespace std; int main(void){ int start = 0, maximum = 0; vector<int> hash(256, -1); string s; cin>>s; for(int i = 0; i < s.length(); ++i){ if(hash[s[i]] == -1){ maximum = max(i-start+1, maximum); }else{ start = max(hash[s[i]]+1, start); } hash[s[i]] = i; } cout<<maximum<<endl; return 0; }
import java.util.*; public class Main { public static void main(String args[]) { Scanner in = new Scanner(System.in); String s = in.nextLine(); System.out.println(new Solution().search(s)); in.close(); } } class Solution{ public int search(String s) { int res = 1; char[] chs = s.toCharArray(); for(int i = 0; i < chs.length; i++) { for(int j = i + 1; j < chs.length; j++) { int flag = 0; String temp = s.substring(i,j + 1); char[] chs1 = temp.toCharArray(); for(int k = 0; k < temp.length(); k++) { if(temp.indexOf(chs1[k]) != temp.lastIndexOf(chs1[k])) { flag = 1; break; } } if(flag == 1) break; res = Math.max(res,temp.length()); } } return res; } }
/* 利用一个ArrayList或者set来保存 */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; public class Main{ public static void main(String[] args)throws IOException{ BufferedReader br = new BufferedReader( new InputStreamReader( System.in )); String str = br.readLine(); int maxcount = Integer.MIN_VALUE; for(int i = 0;i<str.length();i++){ ArrayList<String> arr = new ArrayList<String>(); for(int j = i;j<str.length();j++){ String s = String.valueOf(str.charAt(j)); if(!arr.contains(s)){ arr.add(s); if(arr.size()>maxcount) maxcount = arr.size(); }else{ break; } } } System.out.println(maxcount); } }
#include<bits/stdc++.h> using namespace std; int ha[256]; int main() { string s; cin>>s; memset(ha, -1, sizeof(ha)); int left = 0, res = 0; for(int i = 0; i < s.length(); i++) { if(ha[s[i]] == -1) res = max(res, i-left+1); else left = ha[s[i]] + 1; ha[s[i]] = i; } cout<<res<<endl; }
#include <bits/stdc++.h> using namespace std; int main(){ string str; cin>>str; int Max=0; vector<int> dp(str.size(),0); dp[0]=1; for(int i=1,j=0;i<str.size();i++){ int k; for(k=j;k<i;k++){ if(str[k]==str[i]){ dp[i]=1; j=i; break; } } if(k==i) dp[i]=dp[i-1]+1; Max=max(Max,dp[i]); } cout<<Max; }
#include <bits/stdc++.h> using namespace std; int main(){ string s; cin>>s; int l = s.length(), Max=1, t; for(int i=0;i<l;i++){ map<char,bool> b; int t = 0; for(int j=0;j<l-i;j++){ char c = s[i+j]; if(b.find(c)==b.end()){ b[c] = true; t++; }else{ i += j-1; break; } } if(Max<t) Max = t; } cout<<Max<<endl; return 0; }
#include <iostream> #include <string> using namespace std; int main(){ string s; cin>>s; if(s.empty()) cout<<0<<endl; chart = s[0]; char start = t; int len = 1,maxlen = 1,start_pos = 0; for(int i = 1;i < s.size();++i){ //寻找不重复子串,不包括aaaaa这样的 if(t != s[i] && start != s[i] ){ t = s[i]; len++; } else{ //如果是aaaaa这样的 if(start_pos + 1 == i){ t = s[i]; start_pos++; continue; } //其它情况 else{ if(i +1 < s.size()){ t = s[++i]; start = s[i]; start_pos = i; } len = 1; continue; } } //保存最长子串 if(maxlen < len) maxlen = len; } cout <<maxlen<<endl; return 0; }
import java.util.HashMap; import java.util.Map; import java.util.Scanner; /** * @Author: coderjjp * @Date: 2020-05-10 9:33 * @Description: * @version: 1.0 */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.nextLine(); int max = 0; Map<Character, Integer> map = new HashMap<>(); int left = 0; int i = 0; for (; i < s.length(); i++){ if (map.containsKey(s.charAt(i))){ max = Math.max(max, i - left); left = Math.max(left, map.get(s.charAt(i))+1); } map.put(s.charAt(i), i); } System.out.println(Math.max(max, i - left)); } }
package main import ( "fmt" "os" "bufio" ) var in=bufio.NewReader(os.Stdin) func main() { var s string fmt.Fscan(in,&s) cnt:=map[byte]int{} ans:=0 for l,r:=0,0;r<len(s);r++{ cnt[s[r]]++ for cnt[s[r]]>1&&l<r{ cnt[s[l]]-- if cnt[s[l]]==0{ delete(cnt,s[l]) } l++ } if len(cnt)>ans{ ans=len(cnt) } } fmt.Print(ans) }
#include<bits/stdc++.h> using namespace std; int main() { string s;cin>>s; s.push_back(s.back()); int a[123]={0},sum=0,maxn=INT_MIN; for(int i=0;i<s.length();i++) { for(int j=i;j<s.length()-1;j++) if(a[s[j]]==0) {sum++;a[s[j]]=1;} else {maxn=max(maxn,sum);memset(a, 0, sizeof(a));sum=0;break;} } cout<<maxn;数据量足够小,而且内循环最多26,直接暴力,不用判断每次字符的起始位置。
s = input() stack = [] i = 0 res = '' while i < len(s): if s[i] not in res: res+=s[i] else: stack.append(res) res = s[i] i+=1 if len(res)!=0: stack.append(res) print(len(max(stack, key=len)))