Javascript回文检查

时间:2016-02-20 19:42:25

标签: javascript

我必须编写一个脚本来检查用户输入的单词是否是回文结构。我已经验证了这个词并显示了字符数。也不应该使用反向方法。

我已经查看了一些示例,并认为我需要将用户输入转换为字符串并使用“for”循环和if / else语句。但是如何将用户输入转换为字符串以检查每个字符?这是一个完全混乱,但这是我到目前为止所有:

    function checkWord(userWord3) {
        var answer = "Your word is";

        answer += retrieveWord(userWord3);

        return (answer);
    }

    function retrieveWord(userWord) {
        var string = userWord;
        var i = userWord.length;


        for(var i = 0; i < str.length / 2; i++) {
            alert(str[i], str[str.length -i -1]);
            if( str[i] != str[str.length - i -1] ) {
                return false;
            }
        }
    }

3 个答案:

答案 0 :(得分:1)

您可以尝试此功能

function isPalindrome(str){ 
    if(str.length < 2) return true;
    if(str[0] != str.slice(-1)) return false;
    return isPalindrome(str.slice(1,-1));
}

它使用递归,其逻辑如下 空的和1个字符的字符串被认为是回文

if(str.length == 0 || str.length == 1) return true;

如果第一个和最后一个字符不相同,则该字不是回文

if(str[0] != str.slice(-1)) return false;

如果第一个和最后一个相同,则继续搜索剩余的字符串

return isPalindrome(str.slice(1,-1));

&#13;
&#13;
var result = document.querySelector(".result");
var palindrome = "<span class='palindrome'>it is a palindrome</span>";
var notpalindrome = "<span class='notpalindrome'>it is NOT a palindrome</span>";

function isPalindrome(str){ 
    if(str.length == 0 || str.length == 1) return true;
    if(str[0] != str.slice(-1)) return false;
    return isPalindrome(str.slice(1,-1));
}

document.querySelector("input").addEventListener("keyup", function(){
  if(isPalindrome(this.value)){
    result.innerHTML = palindrome;
  } else {
    result.innerHTML = notpalindrome;
  }
})
&#13;
.palindrome{color: green;}
.notpalindrome{color: red;}
&#13;
<input type="text" />
<span class="result"></span>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您是如何收集用户输入的?几乎在每种情况下,它都会作为一个字符串(即文本框,提示符)进入程序,因此您不必担心将其转换为一个。

这段代码只需要单词,将其分解为数组,反转数组,然后将该反转与原始单词进行比较。它对我有用:

function test(input){

   var originalData = input;
   var a = [];

   for(var i = 0; i < input.length; ++i){
      a.push(input.charAt(i));
   }

   a.reverse();
   return (a.join('') === originalData) ? true : false;
}


var word = document.getElementById("userWord");
alert(test(word)); 

请参阅:https://jsfiddle.net/6cett0bc/6/

上的工作版本

答案 2 :(得分:0)

我能想到的最基本的版本是将单词分成字母并检查第一个字母,直到你最后在中间,如果有一个奇数字母就没关系。< / p>

更新我已经测试了各种实现的性能,并将基于数组的回答改为基于纯字符串的解决方案。 如果你很好奇,here are the performance benchmarks

最快的解决方案(到目前为止):

function palindrome(word) {
  var middle = Math.ceil(word.length / 2),  //  determine the middle
      i; //  prepare the iteration variable

  //  loop from 0 to middle
  for (i = 0; i <= middle; ++i) {
    //  check letter i against it counterpart on the opposite side
    //  of the word
    if (word[i] !== word[(word.length - 1) - i]) {
      //  it is not a palindrom
      return false;
    }
  }
  
  //  otherwise it is
  return true;
}

//  listen for clicks on the button and send the entered value to the palindrom function
document.querySelector('button').addEventListener('click', function(e) {
  //  obtain the input element
  var element = document.querySelector('input');

  //  add/remove the 'palindrom' CSS class to the input field, depending on
  //  the output of palindrome function
  if (palindrome(element.value)) {
    element.classList.add('palindrome');
  }
  else {
    element.classList.remove('palindrome');
  }
});
input {
  color: red;
}

input.palindrome {
  color: green;
}
<input name=check placeholder=palindrome><button>check</button>

如果您已成功输入回文,则文本变为绿色,否则为红色(默认)。