-
读入一行
getline(cin,s,'\n') //s为string类型,第三个参数默认为\n
无重复字符的最长子串
theme:给定一个字符串,求无重复字符的最长子串长度,注意子串是连续的(子序列可以不连续)。
solution:提供两种做法(本质是一样的)
(1)dp:用dp[i]表示以第i个字符结尾的无重复字符的最长子串长度,则最终结果遍历找最大值即可。转移方程:当s[i]==s[i-1]时,dp[i]=1,否则从i-1向前遍历dp[i-1]的长度的字符判断是否与s[i]相同,因为dp[i-1]代表这dp[i-1]个字符互不相同,而其中一个与前一个字符重复。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int l=s.length();
if(!l)
return 0;
int dp[l+5];
dp[0]=1;
for(int i=1; i<l; ++i)
if(s[i]==s[i-1])
dp[i]=1;
else{
dp[i]=dp[i-1]+1;
for(int j=i-2; j>=i-dp[i-1]; --j)
if(s[i]==s[j])
{
dp[i]=i-j;
break;
}
}
// far(i,l)
// cout<<dp[i]<<" ";
int ans=*max_element(dp,dp+l);
return ans;
}
};
(2)用字典记录某个第一次出现的下标,用变量i表示其后有与它相同字串的最大下标,则遍历字符
class Solution:
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
st = {}
i, ans = 0, 0
for j in range(len(s)):
if s[j] in st:
i = max(st[s[j]], i)
ans = max(ans, j - i + 1)
st[s[j]] = j + 1
return ans;
字符串输入输出
input:
|
output:
|
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define far(i,n) for(int i=0;i<n;++i)
typedef long long ll;
char type[15][15];
char name[15][15];
int main()
{
string c;//class
getline(cin,c);
cout<<c<<"\n";
getline(cin,c);//private:
cout<<c<<"\n";
int cnt=0;
while(getline(cin,c)&&c!="};")
{
cout<<c<<"\n";
if(c[4]=='i'){
char x[4]="int";
far(i,4)
type[cnt][i]=x[i];
int i=8;
name[cnt][0]=c[i]-32;
++i;
while(c[i]!=';')
{
name[cnt][i-8]=c[i];
++i;
}
name[cnt][i-8]=0;
}else if(c[4]=='f'){
char x[6]="float";
far(i,6)
type[cnt][i]=x[i];
int i=10;
name[cnt][0]=c[i]-32;
++i;
while(c[i]!=';')
{
name[cnt][i-10]=c[i];
++i;
}
name[cnt][i-10]=0;
}else if(c[4]=='d'){
char x[7]="double";
far(i,7)
type[cnt][i]=x[i];
int i=11;
name[cnt][0]=c[i]-32;
++i;
while(c[i]!=';')
{
name[cnt][i-11]=c[i];
++i;
}
name[cnt][i-11]=0;
}else if(c[4]=='c'){
char x[5]="char";
far(i,5)
type[cnt][i]=x[i];
int i=9;
name[cnt][0]=c[i]-32;
++i;
while(c[i]!=';')
{
name[cnt][i-9]=c[i];
++i;
}
name[cnt][i-9]=0;
}else if(c[4]=='u'){
char x[13]="unsigned int";
far(i,13)
type[cnt][i]=x[i];
int i=17;
name[cnt][0]=c[i]-32;
++i;
while(c[i]!=';')
{
name[cnt][i-17]=c[i];
++i;
}
name[cnt][i-17]=0;
}else if(c[4]=='l'){
char x[10]="long long";
far(i,10)
type[cnt][i]=x[i];
int i=14;
name[cnt][0]=c[i]-32;
++i;
while(c[i]!=';')
{
name[cnt][i-14]=c[i];
++i;
}
name[cnt][i-14]=0;
}
++cnt;
}
cout<<"public:\n";
// for(int i=0;i<cnt;++i){
// cout<<type[i]<<" "<<name[i]<<endl;
// }
for(int i=0;i<cnt;++i)
{
cout<<" "<<type[i]<<" get"<<name[i]<<"()const{return ";
name[i][0]=name[i][0]+32;//small
cout<<name[i]<<";}\n";
name[i][0]=name[i][0]-32;//big
cout<<" void set"<<name[i]<<"("<<type[i]<<" x){";
name[i][0]=name[i][0]+32;//small
cout<<name[i]<<"=x;}\n";
}
cout<<"};\n";
}