给定一个字符串,请找出其中长度最长且不含有重复字符的子串,计算该子串长度。
数据范围:输入的字符串长度满足
,字符串中仅包含小写的英文字母
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;
}
#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.*;
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;
}
}
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));
}
} class MainActivity: def main(self): # Read the data s = input() # Initialization leftPtr = 0 result = 1 records = dict() # Traverse for rightPtr, char in enumerate(s): if char in records: leftPtr = max(leftPtr, records[char] + 1) records[char] = rightPtr result = max(result, rightPtr - leftPtr + 1) print(result) if __name__ == '__main__': M = MainActivity() M.main()
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)))