題目描述
雙生詞
雙生詞是指滿足如下條件的兩個字串:(假設兩個字串分別為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);//字串
}