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