题目大意:就是给定一个字符串s,长度为n,s中间隔为k(k=1,2,3...,n-2)的所有字符对如果没有相同的(保证所有k种距离下的情况),那么s是surprising的;否则NOT surprising。
算法设计:
枚举所有间隔为k内的字符对,如果每一个字符对仅出现一次,那么继续遍历,知道出现有重复的字符对相同,则说明NOT surprising。用map来映射每一个字符对的出现,且能保证唯一。
代码:
#include<iostream>
#include<cstring>
#include<stdio.h>
#include<cstdlib>
#include<map>
using namespace std;
int main()
{
string s;
char ss[3];
map<string,int> map_str;
while(cin>>s)
{
if(s=="*")
{
break;
}
bool flag = true;
//i就是两个字符之间的距离
for(int i=s.length()-1;i>=1;i--)
{
map_str.clear();//不同的字符距离i对应的字符对之间是独立的。
for(int j=0;j<s.length()-i;j++)
{
//cout<<"map_str.size() = "<<map_str.size()<<endl;
//ss为字符对,将它加入到map中
ss[0] = s[j];
ss[1] = s[j+i];
ss[2] = '\0';
//cout<<"ss = "<<ss<<" i = "<<i<<" j = "<<j<<endl;
if( map_str[ ss ] == 1 )
{
flag = false;
break;
}
else
{
map_str[ ss ] = 1;
}
//cout<<"map_str.size() = "<<map_str.size()<<endl;
}
if(!flag) break;
}
if(flag)
{
cout<<s<<" is surprising."<<endl;
}
else
{
cout<<s<<" is NOT surprising."<<endl;
}
}
//system("pause") ;
return 0;
}
Run ID | User | Problem | Result | Memory | Time | Language | Code Length | Submit Time |
12399924 | niuliguo | 3096 | Accepted | 732K | 32MS | G++ | 940B | 2013-12-24 00:49:22 |
注明出处:http://blog.csdn.net/lavorange/article/details/17517855