Javascript 检查两个字符串是否旋转相等
我需要你在以下方面的帮助:我正在尝试开发一个函数,用来检查两个参数字符串是否在旋转方向上彼此相等。比如,如果我们顺时针旋转“abcd”两次,它就会变成“cdab”,所以如果上面的字符串作为参数提供,我的函数应该返回“true”。我解决这个问题的最初想法是检查两个字符串中每个字符之间是否存在常量移位,所以我尝试了Javascript 检查两个字符串是否旋转相等,javascript,string,for-loop,equality,Javascript,String,For Loop,Equality,我需要你在以下方面的帮助:我正在尝试开发一个函数,用来检查两个参数字符串是否在旋转方向上彼此相等。比如,如果我们顺时针旋转“abcd”两次,它就会变成“cdab”,所以如果上面的字符串作为参数提供,我的函数应该返回“true”。我解决这个问题的最初想法是检查两个字符串中每个字符之间是否存在常量移位,所以我尝试了 function areRotEq (str1, str2) { var shift = null; for(char of str1){ if(!shi
function areRotEq (str1, str2) {
var shift = null;
for(char of str1){
if(!shift) shift = str2.indexOf(char);
else if (shift != str2.indexOf(char)) return false
}
return true;
}
但是,它甚至无法正确计算上述简单字符串,并返回“false”。如果您能为我指出正确的方向,找出我的代码不起作用的原因,或者建议一些更有效的方法来解决我的问题,我将不胜感激。
提前谢谢你 这里有另一种方法: 首先,进行绝对正确或错误的“快速”检查 然后,检查str2中str1的第一个字符。此时将其拆分,并将第一部分粘贴到最后一部分的后面。如果两者相等,则它们是旋转的 警告:这不适用于多次包含相同字符的字符串
函数areRotEq(str1、str2){
if(str1==str2)返回true;
if(str1.length!==str2.length)返回false;
var start2=str2.indexOf(str1[0]);
if(start2==-1)返回false;
返回str1==str2.slice(start2)+str2.slice(0,start2)
}
console.log(
areRotEq(“abcd”、“abcd”),
areRotEq(“abcd”、“acdb”),
areRotEq(“abcd”、“dabc”),
areRotEq(“dcab”、“abdc”)
);代码>您可以使用for循环,从0开始递增第一个字符串的索引,从第二个字符串的长度递减第二个字符串的索引。通过这两个索引,您可以比较字符串中的特定字符
函数areRotEq(str1、str2){
对于(变量a=0;a 日志(areRotEq(“abcd”、“dcba”)代码>这就是我解决这个问题的方法。我基本上一直在转换str1,直到它与str2匹配,或者直到我尝试了所有的转换组合
函数areRotEq(str1、str2){
对于(设i=0;i我将使用findIndex处理字母出现次数超过1的字符串,并将其删除
function areRotEq(str1, str2) {
const str1Array = str1.split('');
const str2Array = str2.split('');
for (let i = str1Array.length - 1; i >= 0 ; i--) {
const index = str2Array.findIndex(letter => letter === str1Array[i]);
if (index === -1) {
return false;
}
str2Array.splice(index, 1);
}
return str2Array.length === 0;
}
console.log(areRotEq('abcda', 'cdaba'));
您可以将字符串表示为一个组结构,也就是一组字符(可以将元素放在集合的开头和结尾,就像一组卡片一样)。非常方便的是,JavaScript数组提供了这种开箱即用的功能(通过队列和堆栈的方法shift
和push
。基本上,我们取出字符串中的第一个字符,将其移动到最后一个位置,并进行新的相等性检查。我们重复此操作,直到字符串移动(或旋转)到其初始值:
function areRotEq(str1, str2) {
if (str1.length !== str2.length) {
return false;
}
if (str1 === str2) {
return true;
}
let str1Array = str1.split('');
let tempEl;
for (let i = 0; i < str1.length - 1; i++) {
tempEl = str1Array.shift();
str1Array.push(tempEl);
if (str1Array.join('') === str2) {
return true;
}
}
return false;
}
函数areRotEq(str1、str2){
if(str1.length!==str2.length){
返回false;
}
如果(str1==str2){
返回true;
}
让str1Array=str1.split(“”);
让坦普尔;
for(设i=0;i
您的解决方案不起作用,因为您计算的班次不正确,以下是解决方法:
函数areRotEq(str1、str2){
var-shift=null;
设i=0;
for(str1的字符){
如果(!shift)shift=str2.indexOf(char);
否则{
const currentShift=Math.abs(str2.indexOf(char)-i);
如果(shift!=currentShift)返回false;
}
i++;
}
返回true;
}
以下是串联技巧解决方案:
函数areRotEq(str1、str2){
if(str1.length!=str2.length)返回false;
返回(str1+str1).indexOf(str2)!=1;
}
如果两个字符串相互旋转,则一个字符串存在于另一个字符串中,该字符串连续重复两次!此逻辑的实现很容易:
功能rotEq(str1、str2){
var-str=str1+str1;
返回str.includes(str2);
}
控制台日志(rotEq(“abcd”、“bcda”);
日志(rotEq(“abcde”、“cdeab”);
console.log(rotEq(“abcd”,“acdb”);
此函数将检查两个字符串是否旋转相等,如果两个字符串旋转相等,则返回需要旋转以使其相等的元素数
const areRotEq= (first, second) => {
let result = -1;
const lengthUnmatch = first.length != second.length
if (lengthUnmatch)
return result
else
const temp = second.concat(second)
if (temp.includes(first))
return temp.indexOf(first)
else
return result
}
此函数将检查两个字符串是否旋转相等,如果两个字符串旋转相等,则返回true,否则返回false
const areRotEq= (first, second) => {
let result = false;
const lengthUnmatch = first.length != second.length
if (lengthUnmatch)
return result
else
const temp = second.concat(second)
if (temp.includes(first))
return true
else
return result
}
当出现重复字符时,该方法将失败(例如,对于'aabc','abca',它将返回false
。对于areRotEq('abcd','abc'),
),该连接技巧将返回true
。
您是对的,需要额外检查字符串长度是否相等,最好使用更多ES6版本:const areRotEq=(str1,str2)=>str1.length==str2.length&&str1.repeat(2).indexOf(str2)>-1
concat的性能似乎比其他解决方案要好得多,而且@U25lYWt5IEJhc3RhcmQg的建议也将是最紧凑的解决方案,所以我接受这个建议。谢谢!很好的捕获。谢谢你的评论。我将添加一个快速警告,很遗憾现在没有时间修复