2015-11-12 11 views
9

मैंने स्ट्रिंग में सबसे लंबा पैलिंड्रोम खोजने के लिए निम्न फ़ंक्शन लिखा था। यह ठीक काम करता है लेकिन यह "दोपहर" या "रेडर" जैसे शब्दों के लिए काम नहीं करेगा। मैं आसपास fiddled और से for पाश में पहली पंक्ति बदल दिया है:स्ट्रिंग में सबसे लंबा पैलिंड्रोम

var oddPal = centeredPalindrome(i, i); 

var oddPal = centeredPalindrome(i-1, i); 

करने के लिए और अब यह काम करता है, लेकिन मैं क्यों पर स्पष्ट नहीं कर रहा हूँ। मेरा अंतर्ज्ञान यह है कि यदि आप एक विषम-लंबाई वाले पैलिंड्रोम की जांच कर रहे हैं तो शुरुआत में एक अतिरिक्त चरित्र होगा (मैंने इसे व्हाइटबोर्ड किया था और यह निष्कर्ष है कि मैं आया हूं)। क्या मैं अपने तर्क के साथ सही रास्ते पर हूं?

var longestPalindrome = function(string) { 

    var length = string.length; 
    var result = ""; 

    var centeredPalindrome = function(left, right) { 
    while (left >= 0 && right < length && string[left] === string[right]) { 
     //expand in each direction. 
     left--; 
     right++; 
    } 

    return string.slice(left + 1, right); 
    }; 

    for (var i = 0; i < length - 1; i++) { 
    var oddPal = centeredPalindrome(i, i); 
    var evenPal = centeredPalindrome(i, i); 

    if (oddPal.length > result.length) 
     result = oddPal; 
    if (evenPal.length > result.length) 
     result = evenPal; 
    } 

    return "the palindrome is: " + result + " and its length is: " + result.length; 
}; 

अद्यतन: पॉल भयानक answer के बाद, मुझे लगता है कि यह समझ में आता है स्पष्टता के लिए दोनों चर बदलने के लिए:

var oddPal = centeredPalindrome(i-1, i + 1); 
var evenPal = centeredPalindrome(i, i+1); 
+0

हाँ - अंत में यह समझ में आता है। निश्चित रूप से आप EVEN palindromes के लिए i + 1 करेंगे क्योंकि उनके "केंद्र" बाधाओं के लिए 1 के बजाय 2 होंगे। धन्यवाद! – devdropper87

+0

मुझे लगता है कि यह अधिक सहज हो सकता है, ऊपर भी संपादन: var oddPal = centeredPalindrome (i-1, i + 1); var evenPal = centeredPalindrome (i, i + 1); – devdropper87

+0

मैं बस यह इंगित करना चाहता था कि इस समस्या के लिए एक तेज़ रैखिक समय एल्गोरिदम है ['मनचेर का एल्गोरिदम'] (https://en.wikipedia.org/wiki/Longest_palindromic_substring) के रूप में। – Blastfurnace

उत्तर

4

आप इसे पीछे की ओर है - अगर आप आउटपुट "अजीब" खोल देना (के साथ अपने ठीक करें) आप पाएंगे कि वे वास्तव में भी लंबाई हैं।

पहले "ओ" (बाएं और दाएं) से शुरू होने वाले "दोपहर" की कल्पना करें। वह मैचों, तो आप उन्हें दोनों ले जाते हैं - अब आप पहले "एन" की तुलना दूसरे "ओ" से कर रहे हैं। अच्छा नहीं। लेकिन फिक्स के साथ, आप "ओ" दोनों की तुलना करना शुरू करते हैं, और फिर दोनों "n" s पर जाते हैं।

उदाहरण (var oddPal = centeredPalindrome(i-1, i); ठीक से):

var longestPalindrome = function(string) { 
 

 
    var length = string.length; 
 
    var result = ""; 
 

 
    var centeredPalindrome = function(left, right) { 
 
    while (left >= 0 && right < length && string[left] === string[right]) { 
 
     //expand in each direction. 
 
     left--; 
 
     right++; 
 
    } 
 

 
    return string.slice(left + 1, right); 
 
    }; 
 

 
    for (var i = 0; i < length - 1; i++) { 
 
    var oddPal = centeredPalindrome(i, i + 1); 
 

 
    var evenPal = centeredPalindrome(i, i); 
 

 
    if (oddPal.length > 1) 
 
     console.log("oddPal: " + oddPal); 
 
    if (evenPal.length > 1) 
 
     console.log("evenPal: " + evenPal); 
 

 
    if (oddPal.length > result.length) 
 
     result = oddPal; 
 
    if (evenPal.length > result.length) 
 
     result = evenPal; 
 
    } 
 
    return "the palindrome is: " + result + " and it's length is: " + result.length; 
 
}; 
 

 
longestPalindrome("nan noon is redder");

+0

मुझे नहीं लगता कि यह कोड रिक्त स्थान के लिए जांचता है। तो यदि उदाहरण के लिए आप 'longestPalindrome (" a level b ") चलाते हैं;' आपको सबसे लंबे समय तक पैंडिंड्रोम "स्तर" के रूप में 7 स्तर की लंबाई के साथ प्राप्त होगा। – jmdeamer

+0

सच है, हालांकि (मेरे पढ़ने के दायरे से बाहर) प्रश्न। निश्चित रूप से अपना स्वयं का जवाब जोड़ने पर विचार करें जो समस्या के उस हिस्से को हल करता है। –

0

यह इष्टतम हो सकता है अगर सबसे बड़ा विलोमपद पहले पाया जाता है। एक बार यह पाया गया कि यह दोनों लूप से बाहर निकल जाएगा।

function isPalindrome(s) { 
     //var rev = s.replace(/\s/g,"").split('').reverse().join(''); //to remove space 
     var rev = s.split('').reverse().join(''); 
     return s == rev; 
    } 

    function longestPalind(s) { 
     var maxp_length = 0, 
     maxp = ''; 
     for (var i = 0; i < s.length; i++) { 
     var subs = s.substr(i, s.length); 
     if (subs.length <= maxp_length) break; //Stop Loop for smaller strings 
     for (var j = subs.length; j >= 0; j--) { 
      var sub_subs = subs.substr(0, j); 
      if (sub_subs.length <= maxp_length) break; // Stop loop for smaller strings 
      if (isPalindrome(sub_subs)) { 

       maxp_length = sub_subs.length; 
       maxp = sub_subs; 

      } 
     } 
     } 
     return maxp; 
    } 
संबंधित मुद्दे