题目描述
双生词
双生词是指满足如下条件的两个字符串:(假设两个字符串分别为S和S’)
1. 字符串长度相同
2. 将字符串S收尾绕成环,再选一个位置切开,顺时针或逆时针能够得到字符串S’
容易得到,若s与S’为双生词,则s’与s也为双生词
给定一批仅有英文小写字母组成的字符串,询问他们之中是否存在双生词
输入描述
首先给出测试组数t,表示一共有多少组数据
对于每组数据,第一行为一个整数n,表示一共有多少个字符串。接下来n行,每行一个字符串
思路
判断str1和str2是否为双生词很简单:
str = str1+str1 //解决收尾相连的问题
比较 str2是否为str中的子串,若是,则返回true
比较 str2.reverser()是否为str中的子串,若是,返回true //解决逆时针循环的问题
否则返回false
样例
输入
3
2
Helloworld
Hdlrowolle
2
Helloworld
Worldhello
2
Abcde
Acbde
输出
Yeah
Yeah
Sad
JavaScript实现
const twins = (str1,str2) => {
print("str1:",str1,"str2:",str2);
if(str1.length != str2.length){
return false;
}
let str = str1+str1;
print("str:",str);
if(str.indexOf(str2) != -1){
return true;
}
//let str3 = str2.reverse(); //翻转str2
//字符串翻转
var newstr = str2.split("").reverse().join("");
print("new:",newstr);
if(str.indexOf(newstr) != -1){
//print(str,str2);
return true;
}
return false;
}
var m = parseInt(readline());
for(let i = 0; i < m; i++){
var n = parseInt(readline());
let arr = [];
for (let j = 0; j < n; j++) {
let line2 = readline();
//arr.push(line2.split(''));//数组
arr.push(line2);//字符串
}
let flag = false;
find:
for(let j = 0; j < n; j++){
for(let k = j+1; k < n; k++){
if(twins(arr[j], arr[k])){
flag = true;
print("true");
break find;
}
}
}
if(!flag){
print(false);
}
}
JavaScript字符串翻转
var newstr = str2.split("").reverse().join("");
JavaScript二维数组输入
var n = parseInt(readline());
let arr = [];
for (let j = 0; j < n; j++) {
let line2 = readline();
arr.push(line2.split(''));//数组
//arr.push(line2);//字符串
}
JavaScript字符串输入
var n = parseInt(readline());
let arr = [];
for (let j = 0; j < n; j++) {
let line2 = readline();
//arr.push(line2.split(''));//数组
arr.push(line2);//字符串
}