[编程题] 黑化的牛牛
时间限制:1秒
空间限制:32768K
牛牛变得黑化了,想要摧毁掉地球。但他忘记了开启地球毁灭器的密码。牛牛手里有一个字符串S,牛牛还记得从S中去掉一个字符就恰好是正确的密码,请你帮牛牛求出他最多需要尝试多少次密码。
如样例所示S = "ABA",3个可能的密码是"BA", "AA", "AB".
当S = "A", 牛牛唯一可以尝试的密码是一个空的密码,所以输出1.
输入描述:
输入包括一个字符串S,字符串长度length(1 ≤ length ≤ 50),其中都是从'A'到'Z'的大写字母。
输出描述:
时间限制:1秒
空间限制:32768K
牛牛变得黑化了,想要摧毁掉地球。但他忘记了开启地球毁灭器的密码。牛牛手里有一个字符串S,牛牛还记得从S中去掉一个字符就恰好是正确的密码,请你帮牛牛求出他最多需要尝试多少次密码。
如样例所示S = "ABA",3个可能的密码是"BA", "AA", "AB".
当S = "A", 牛牛唯一可以尝试的密码是一个空的密码,所以输出1.
输入描述:
输入包括一个字符串S,字符串长度length(1 ≤ length ≤ 50),其中都是从'A'到'Z'的大写字母。
输出描述:
输出一个整数,表示牛牛最多需要尝试的密码次数。
思路分析:
由于是需要每次去掉字符串S中的一个字符,因此需要找到S中所有去掉一个字符后的子串,并且里面没有重复的子串。这里我们可以利用STL中set集合容器。set不允许两个元素有相同的键值。因此可以将所有可能的子串存放到set容器中,达到不出现重复子串的目的。
set的特性是,所有元素都会根据元素的键值自动排序,set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值。set不允许两个元素有相同的键值。
#include<iostream>
#include<set>
using namespace std;
string SubString(string s,int n) //函数作用:去掉第i个位置后得到的子串,就是把所有的i后面的元素往前移动一位
{
int length=s.size();
for(int i=n;i<length;i++)
{
s[i]=s[i+1];
}
s[length]='\0'; //需要注意的是这里的字符串结束符'\0'
return s;
}
int main()
{
string s,sub;
set<string> SubStr;
int count;
while(cin>>s)
{
int length=s.size( );
if(length==1) //题目意思很清楚,当字符串S中只有一个字符时需要做特殊处理
{
cout<<"1"<<endl;
break;
}
for(int i=0;i<length;i++)
{
sub=SubString(s,i);
SubStr.insert(sub);
}
count=SubStr.size();
cout<<count<<endl;
}
}