今天继续刷牛客真题,求最短子序列。
分析:
刚刚开始以为需要判断的是‘A’、‘C’、‘G’、‘T’、‘AA’、‘C’、‘GG’、‘TT’,这种类型,但是题目说的是长度为2的全部,所以应该包含’AC’这种,因此可以通过找到长度为n的不同子字符串个数是否等于4的n次方来判断。其中判断不同的子字符串的时候就需要用到set函数来保证关键字唯一。
问题:
1、C++中求子字符串的时候可以使用s.substr(begin,length);
2、set添加元素使用s.insert();
3、Python中set函数的使用是s.add();
附上C++代码:
#include<iostream>
#include<set>
#include<math.h>
#include<string>
using namespace std;
int main()
{
string s;
getline(cin,s);
for(int i=1;i<=s.length();++i)
{
set<string> t;
for(int j=0;j<=s.length()-i;++j)
t.insert(s.substr(j,i));
if(t.size()<(int)pow(4,i))
{
cout<<i<<endl;
break;
}
}
return 0;
}
附上Python代码1:
s=input()
for i in range(1,len(s)+1):
l=[]
l=set(l)
for j in range(0,len(s)-i+1):
l.add(s[j:j+i])
if len(l)<(4**i):
print(i)
break;
另外可以通过组合的方式,将每种组合列举出来,并且判断每种组合是否在原字符串中。
附上Python代码2:
s=input()
def f(s):
t=['']
for i in range(len(s)):
l=[]
for item in t:
for char in ['A','C','G','T']:
if item+char not in s:
return i+1
l.append(char+item)
t=l
print(f(s))