【问题标题】:Checking if str1 can be re-arranged as str2 wth JavaScript检查 str1 是否可以用 JavaScript 重新排列为 str2
【发布时间】:2021-08-23 15:56:40
【问题描述】:

有两个字符串分别称为str1str2,我正在尝试检查 str1 是否可以重新排列为 str2。

例如:假设 str1 = "aabbcamaomsccdd" 和 str2="commas"。 “str1”可以写出“逗号”这个词吗

function scramble(str1, str2) {

  let arr=[]; 
  let str1arr =  str1.split("");
  let str2arr =  str2.split("");
  let j=0;
  
  for(let i=0; i<str1.length; i++){
    if(str1arr[i]==str2arr[j]){
      arr.push(str1arr[i]);
      str1arr=str1arr.splice(i,1);
      j++;
      i=0;
      
    }
    
  }if(arr.toString()===str2arr.toString()){
    return true;
  }else{
    return false;
  }
    }

如果str1arr[i]==str2arr[j] 基本上我尝试过,它将把str1arr[i] 值放在一个名为arr 的新数组上,最后它将比较str2arr 并返回True 或False。

我在匹配后使用str1arr=str1arr.splice(i,1); 删除i 的原因是因为每次ij 匹配时,for 循环都会自行从“i=0”检查i 将与其他重复的字母匹配(我希望这至少是它的作用:D)。

这是一个互联网问题,我没有通过测试。如果结果为 FALSE,我只会通过。

我想知道我在做什么和想错了。它的性能效率也不高,所以对此的任何评论也很棒。

【问题讨论】:

  • 是否对字符串进行排序和比较工作?
  • 你应该说只测试 string1 的一部分,而不是整个字符串,因为它改变了任务:stackoverflow.com/questions/40823054/…
  • 我不明白str1的部分是什么意思。 Str1 基本上是像 str1="aabbcamaomsccdd" 这样的加扰字母,而 str2 是 = "commas" 可以说。问题是可以从str1中的字母中分辨出逗号。

标签: javascript


【解决方案1】:

您可以获取数组并对它们进行排序,然后将第二个字符串/数组的每个字符与第一个字符进行对比。

function compare([...a], [...b]) {
    a.sort();
    return b.sort().every((i => v => {
        while (i < a.length && a[i] !== v) i++;
        return a[i++] === v;
    })(0));
}

console.log(compare("aabbcamaomsccdd", "commas")); //  true
console.log(compare("aabbcamaomccdd", "commas"));  // false

【讨论】:

    【解决方案2】:

    您应该检查两个字符串是否包含相同的字符,如下所示:

    function scramble(str1, str2) {
        var s1 = str1.split('');
        var s2 = str2.split('');
        var i;
        for (i = 0; i < s2.length; i++) {
          const idx = s1.indexOf(s2[i]);
          if (idx === -1) {
            return false;
          }
          s1.splice(idx, 1);
        }
        return s1.length === 0;
    }
    
    console.log(scramble('xcab1c', 'abxcc1'));

    【讨论】:

    • 如果 st1 和 st2 的长度相同,这将不起作用。
    • 当然可以!如果 s2 更长,那么在某些时候,您将在 indexOf() 中得到 -1。如果 s1 更长,那么您将在 return s1.length === 0 得到错误
    • 我实际上不知道为什么您的代码无法通过测试,我觉得它看起来不错。但是我将 if 更改为 if(idx&gt;1){ s1.splice(idx,1) 并在 if 之后放置了一个返回 false 的 else。现在它通过了测试,但仍然未能通过性能测试并超时。
    【解决方案3】:

    您可以计算第一个字符串中每个字符出现的频率。下面我使用.reduce() 构建了一个带有键值对的对象,其中键代表s1 字符串中的一个字符,值是它出现的次数。然后,您可以遍历 s2 中的字符并检查每个字符是否出现在频率图中。当您看到一个字符时,您可以从频率对象的值中减去一个以表示该字符已被“使用”。如果.every() 回调返回一个假值(例如该值是0),那么结果将是false,因为您的字符串无法重新排列:

    const scramble = (s1, s2) => {
      const s1Freq = [...s1].reduce((o, c) => ({...o, [c]: (o[c] || 0) +1}), {});
      return [...s2].every(char => s1Freq[char]--); 
    }
    
    console.log(scramble("aabbcamaomsccdd", "commas")); // true
    console.log(scramble("abc321", "123")); // true
    console.log(scramble("a3b2c11", "1231")); // true
    console.log(scramble("a", "a")); // true
    console.log(scramble("xyz", "xyt")); // false

    【讨论】:

      猜你喜欢
      • 2010-09-16
      • 1970-01-01
      • 2013-08-11
      • 2017-04-10
      • 2011-09-11
      • 1970-01-01
      • 2015-05-14
      • 2011-01-21
      相关资源
      最近更新 更多