简单搜索&&进阶搜索 - Virtual Judge (vjudge.net)
编织字符串的操作将s1和s2拼接起来(注意这里s2先拼接,具体请看样例),得到长度为len*2的字符串s。
假设有s1="JNU",s2="ACM",s="NAMJUC"
第一次操作后得到s'="AJCNMU",与s不相等。
令s1="AJC",s2="NMU"
第二次操作后得到s'="NAMJUC",与s相等,结束循环。
输出操作次数为2
【输入】
第一行一个整数T(1≤T≤1000),代表测试数据组个数。
对于每组数据,第一行为len(1≤len≤100),第二行为字符串s1,第三行为字符串s2,第四行为字符串s。
输入保证s1和s2长度均为len,s长度为len*2
【输出】
对每一组数据,输出数据组编号和答案。
如果无论经过多少次操作也无法结束循环,答案输出-1
解题思路:
除了题目中设置的字符串 s1 和 s2,用字符串 s 存放输入的目标字符串,再用字符串 S 存放每次修改后的字符串。
我首先想到的是思路就是,把每次修改后的字符串记录下来,每次修改完用 strcmp 函数比较是否与目标字符串 s 相等,也就是 strcmp(S,s)==0 的情况。
如果可以转换成功的字符串这样做没什么问题,但是要考虑循环多少次,才能判断无论循环多少次,也无法结束循环。
第一种方法:我是用的枚举,列举几个字符串,一遍一遍转换,最后在转换 2*len 次后发现又回到了第一次转换成的字符串,这就说明如果循环重复 2*len 遍,还没有与目标字符串一致的话,就输出 -1。
第二种是用哈希,不用上面的举例,把每次翻转之后的对应的哈希值存入数组,如果哈希值没有重复的,说明字符串的翻转过程中没有出现重复的情况,当重复的出现时就结束循环,并且输出 -1。
对于每次字符串的翻转都要将字符串 s1 和 s2 更新,代码如下:
for(j=0;j
刚开始一直出错,原因是我用的字符串都是定义的全局变量,但是对于循环输入和输出,字符串 S 的前部分一直在更新,而后部分如果赋值了,之后再用 strcmp 函数比较字符串是否相等肯定会出错,所以这里的修改可以是:将字符串 S 定义为循环局部变量,最好是初始化,或者是定义了全局变量,每次循环时进行初始化。
代码如下:
#include
#include
int w;
char s1[105],s2[105],s[205];
int main()
{int len,n,i,j,k;scanf("%d",&n);for(i=0;i
还有一个题目的问题总是碰到,每次解决了还是会忘,今天上实验课的时候又错了。
对于顺序表来说,字符的插入和删除应该是要很熟练了。
删除时:
//删除重复元素int k=0;for(i=1;i<=n-k;i++){if(a[i]==a[i-1]){for(j=i+1;j<=n;j++){a[j-1]=a[j];}k++;i--;}}
最后这个 i-- 的作用很关键。
如果没有这个语句,那么对于三个及以上的重复部分来说就会出问题。
比如:下表为 i-1和下标为 i 的元素重复了,此时根据代码,会将下标为 i 至下标为 n 的元素全部向前移动,而现在在 i 位置的就是原来在 i+1 位置的元素,此时到下一层循环时,i++后,该元素换位置之后就不会进行比较操作了,就会忽略掉这个字符,所以出错。