【问题标题】:How to compare a string with each string in a list in js?如何将字符串与js中列表中的每个字符串进行比较?
【发布时间】:2015-03-12 10:15:42
【问题描述】:

问题是,

Given a word and a list of possible anagrams, selects the correct sublist.

Given "listen" and a list of candidates like "enlists" "google"
"inlets" "banana"` the program should return a list containing
"inlets".

给出的测试用例类型:

var anagram = require('./anagram');

describe('Anagram', function() {

  xit("detects simple anagram",function() {
    var subject = anagram("ant");
    var matches = subject.matches(['tan', 'stand', 'at']);

    expect(matches).toEqual(['tan']);
  });
});

这是我一直在想的,

  1. 输入给定的单词,拆分每个字符并按字母顺序排序
  2. 获取列表,将其拆分为单词,获取每个单词并拆分每个字符并按字母顺序排序
  3. 比较1和2的结果,如果一个字符串匹配,返回它的原始形式。

但问题是,我不知道如何开始,请帮忙。

【问题讨论】:

  • anagram("ant"); 的结果是什么?

标签: javascript string node.js jasmine


【解决方案1】:

是的,你的想法是正确的,下面是你如何实现它:

var anagrams = function( input, wordlist ){
    // sort the input word
    var sortedinput = input.split('').sort().join(''); 
    // filter the array by checking if...
    return wordlist.filter( function( word ){
        // ...the word after sorting matches the sorted input
        return word.split('').sort().join('') == sortedinput; 
    });
}

anagrams( 'listen', ["enlists", "google", "inlets", "banana"] );
// ["inlets"]

http://jsfiddle.net/2kkvw4u5/

【讨论】:

  • 好的,我明白了。但不知何故,它没有通过测试。我收到 TypeError: Cannot call method 'filter' of undefined.
  • 它不会通过您问题中发布的测试,因为测试期望 anagram() 返回一个对象,该对象公开一个将数组作为参数的 matches 方法。
  • 啊哈!知道了。但是现在有另一个问题,它不区分大小写。本次测试jsfiddle.net/j8xhvqng
  • 只需在两个地方的.split() 之前添加.toLowerCase()。但这是一些网络作业的问题吗?您应该能够查找“javascript 中的小写字符串”。
  • 是的,这是一个帮助您学习 javascript 的拼图。顺便说一句,这里仍然失败jsfiddle.net/j8xhvqng/1
【解决方案2】:

将当前单词拆分成char数组后:

  1. 遍历单词列表;

  2. 检查数组的长度是否与比较的字字符数组相等;

  3. 对比较的字字符数组和当前字字符数组进行排序,并检查每个元素对于该数组中的所有索引是否相等。

【讨论】:

  • 在拆分和排序之前进行长度检查的很好的优化!
猜你喜欢
  • 2020-12-18
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
相关资源
最近更新 更多