目录
题目
思路
注意事项
C++代码
题目
Description
龙龙在研究字符串和字符串处理。龙龙发现有一些字符串让他第一眼看到就会发自内心的感到快乐,他把这些字符串称为“肥宅快乐串"。龙龙进一步研究发现,一个字符串是"肥宅快乐串",当且仅当这个字符串存在至少一个子串是"fattyhappy"。字符串的子串是指这个字符串中截下来的连续的一段。比如"fffffattyhappyyyyy"就有一个"fattyhappy"子串,而"faaaaattyhappy"就没有一个"fattyhappy"子串。现在龙龙看到了好多个字符串,他想对每一个字符串交换恰好一对字符的位置,使得这个字符串变成"肥宅快乐串"。请注意:必须进行一次交换,不允许不交换。龙龙真的很想见到"肥宅快乐串",请你帮帮龙龙吧,告诉他应该交换字符串里哪两个位置的字符。
Input
输入共有 行,其中 表示需要你进行操作的字符串个数;
第一行一个正整数;
接下来第 到第 行,每行输入一个字符串,表示需要你帮忙变成"肥宅快乐串"的原来的字符串,一共有 行。
Output
输出 行,表示这 个字符串的交换方案。对于每个字符串,如果有解,输出两个数 ,表示交换字符串的第 个和第 个字符。否则输出一个数 ,表示没有方案。如果有多种方法使得它变成"肥宅快乐串",输出任意一种即可。
Note
所有数据保证 。即单个字符串长度不超过 ,所有字符串总长度不超过 。保证字符串中只有小写字母出现。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
思路
- 用两个for循环嵌套比较每一次输入的连续字符串子串和"fattyhappy",用count记录字母数;
若count==0,即找寻到与"fattyhappy"一致的连续子串,直接交换内部两个t即可;
若count==1,即找寻到的连续子串相差一个字母,则从其他位置搜寻正确的字母与其交换;若count==2,即相差两个字母,需检查两者交换后能否成为"fattyhappy";
若count>2,可以直接跳出内循环,从下一个字母开始搜索。 - 重复以上两步,直到找到符合要求的交换或搜寻结束为止。
注意事项
- 用count记录不同字符数,index1和index2记录当前不一样字符在字符串中的下标,ch1和ch2记录在肥宅快乐串中需要的字符,flag作为是否已经找到子串的标志。记得在合适位置初始化。
- for的外循环i的边界至少是s.size()-9,即i至少得遍历到倒数第十个数。
- 注意索引下标与位置的区别,位置=索引下标+1
- 当count为2时,应判断s[index1] == ch2 && s[index2] == ch1是否成立,而不是判断ch1==ch2是否成立
- 只需要一组答案,因此得到结果后就可以break
C++代码
#include<iostream>
#include<string>
using namespace std;int main()
{int T, count = 0;string str = "fattyhappy";cin >> T;while (T--){string s;cin >> s;int flag = 0;//flag作为可否得到肥宅快乐串的标志符for (int i = 0; i < s.size() - 9; i++){//记得每次循环要初始化int count = 0, index1, index2;char ch1, ch2;for (int j = 0; j < 10; j++) //对每一个i往后遍历找十个字符与肥宅快乐串对应字符作比较 if (s[i + j] != str[j]) {//出现不一样的字符if (count == 0){ch1 = str[j]; //存取需要的字符 index1 = i + j; //记录原来的字符位置 count++;}else if (count == 1){count++;ch2 = str[j];//存取需要的字符index2 = i + j; //记录原来的字符位置 }else if (count > 1)count++;}if (count == 0) //无不同则在原本字符串内交换 {cout << i + 4 << " " << i + 3 << endl; //此时的i即为fattyhappy的第一个字符 flag = 1;break;}else if (count == 1) //一个不同,从10个之外的字符里找符合要求的 {for (int k = 0; k < s.size(); k++){if (k == i){k += 10; continue;}if (s[k] == ch1){cout << k + 1 << " " << index1 + 1 << endl;flag = 1;break;}}if (flag == 1) break;}else if (count == 2) //两个不同,如果彼此交换得到肥宅快乐串即可 {if ({cout << index1 + 1 << " " << index2 + 1 << endl;flag = 1;break;}}else continue; //不同字符大于2,怎样更换都无法满足条件 ,继续寻找 }if (flag == 0) cout << -1 << endl; //遍历了整个字符串字串依然没有找到符合的情况 }return 0;
}