检查两个琴弦在旋转方向上是否相等

时间:2019-06-13 11:02:35

标签: javascript string for-loop equality

在以下方面,我需要您的帮助:我正在尝试开发一个函数,该函数应检查两个参数字符串在旋转上是否彼此相等。就像,如果我们顺时针旋转两次,“ abcd”将变成“ cdab”,因此,如果上述字符串作为参数提供,则我的函数应该返回“ true”。解决这个问题的最初想法是检查两个字符串中每个字符之间是否存在恒定移位,所以我尝试了

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'。如果您可以为我指明正确的方向,以弄清楚为什么我的代码无法正常工作,或者提出一些更有效的方法来解决我的问题,将不胜感激。 预先谢谢你!

8 个答案:

答案 0 :(得分:4)

这是另一种方法:

首先,进行绝对正确或错误的“快速”检查。

然后,检查str2中str1的第一个字符。此时将其拆分,然后将第一部分粘贴到最后一部分的后面。如果两者相等,则它们是旋转的。

警告:这不适用于多次包含相同字符的字符串。

function areRotEq (str1, str2) {
    if (str1 === str2) return true;
    if (str1.length !== str2.length) return false;
    
    var start2 = str2.indexOf(str1[0]);
    if (start2 === -1) return false;

    return str1 === str2.slice(start2) + str2.slice(0, start2)
}

console.log(
  areRotEq("abcd", "abcd"),
  areRotEq("abcd", "acdb"),
  areRotEq("abcd", "dabc"),
  areRotEq("dcab", "abdc")
);

答案 1 :(得分:2)

这就是我解决此问题的方法。我基本上一直在移动str1直到它与str2相匹配,或者直到尝试了每种组合。

function areRotEq (str1, str2) {
    for(let i=0; i<str1.length; ++i) {
        // shift str1
        str1 = str1[str1.length-1] + str1.substring(0, str1.length-1);
        if(str1 === str2) {
            return true;
        }
    }
    return false;
}


console.log(
    areRotEq('12345', '34512'), // true
    areRotEq('12345', '23451'), // true
    areRotEq('12345', '12354') // false
);

答案 2 :(得分:1)

您的解决方案无效,因为您计算的班次不正确,这是解决方法:

function areRotEq (str1, str2) {
    var shift = null;
    let i = 0;
    for(char of str1){
        if(!shift) shift = str2.indexOf(char);
        else {
            const currentShift = Math.abs(str2.indexOf(char) - i);
            if (shift != currentShift) return false;
        } 
        i++;
    }
    return true;
}

这是串联技巧的解决方案:

function areRotEq (str1, str2) {
    if (str1.length != str2.length) return false;
    return (str1 + str1).indexOf(str2) != -1;
}

答案 3 :(得分:0)

您可以使用for循环,将第一个字符串的索引从0开始递增,并将第二个字符串的索引从其长度递减。使用这两个索引,您可以比较字符串中的特定字符。

function areRotEq(str1, str2) {
  for (var a = 0; a < str1.length; a++) {
    if (str1.charAt(a) != str2.charAt(str2.length - (a + 1))) {
      return false;
    }
  }
  return true;
}
console.log(areRotEq("abcd", "dcba"));

答案 4 :(得分:0)

我将对包含多于1个字母的字符串使用findIndex并将其删除

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'));

答案 5 :(得分:0)

您可以将字符串表示为一副牌结构,即一副字符(能够将元素放置在集合的开头和结尾,就像一副牌一样)。很方便地,JavaScript数组提供了开箱即用的功能(通过队列和堆栈的方法shiftpush。基本上,我们取出字符串中的第一个字符并将其移到最后一个位置并进行新的相等性检查。重复此操作,直到字符串移位(或旋转)为其初始值:

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;
}

答案 6 :(得分:0)

如果两个字符串彼此旋转,则另一个字符串中存在一个字符串,该字符串重复两次连续!实施此逻辑非常容易:

function rotEq(str1, str2) {
  var str = str1 + str1;
  return str.includes(str2);
}

console.log(rotEq("abcd", "bcda"));
console.log(rotEq("abcde", "cdeab"));
console.log(rotEq("abcd", "acdb"));

答案 7 :(得分:0)

此函数将检查两个字符串是否旋转相等,如果两个字符串旋转相等,则它将返回旋转以使它们相等所需的元素数。

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 
 }

此函数将检查两个字符串是否旋转相等,如果两个字符串旋转相等则返回真,否则返回假。

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 
 }