Javascript 字符串中最长的回文
我编写了以下函数来查找字符串中最长的回文。它可以很好地工作,但对“中午”或“更红”这样的词不起作用。我拨弄了一下,将Javascript 字符串中最长的回文,javascript,algorithm,palindrome,Javascript,Algorithm,Palindrome,我编写了以下函数来查找字符串中最长的回文。它可以很好地工作,但对“中午”或“更红”这样的词不起作用。我拨弄了一下,将for循环中的第一行从: var oddPal = centeredPalindrome(i, i); 到 现在它起作用了,但我不清楚为什么。我的直觉是,如果你检查一个奇数长度的回文,它会在开头有一个额外的字符(我用白板把它涂掉了,这就是我得出的结论)。我的推理正确吗 var longestPalindrome = function(string) { var length
for
循环中的第一行从:
var oddPal = centeredPalindrome(i, 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;
};
如果你输出“奇数”回文(带有你的修正),你会发现它们实际上是偶数长度 想象一下“中午”,从第一个“o”(左和右)开始。匹配,然后移动它们-现在比较第一个“n”和第二个“o”。无益。但是有了这个修正,你开始比较两个“o”,然后移动到两个“n” 示例(使用
var oddPal=centeredPalindrome(i-1,i);
fix):
var longestPalindrome=函数(字符串){
var length=string.length;
var结果=”;
var centeredPalindrome=函数(左、右){
而(左>=0&&right1)
log(“oddPal:+oddPal”);
如果(evenPal.length>1)
console.log(“evenPal:+evenPal”);
如果(oddPal.length>result.length)
结果=oddPal;
if(evenPal.length>result.length)
结果=evenPal;
}
return“回文为:“+result+”,长度为:“+result.length;
};
console.log(
最长回文(“南正午更红”)
);代码>如果更早地找到最大回文,这将是最佳选择。
一旦找到它,它将退出两个循环
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;
}
函数isAlindrome(s){
//var rev=s.replace(//\s/g,“”).split(“”).reverse().join(“”);//删除空格
var rev=s.split(“”).reverse().join(“”);
返回s==rev;
}
函数longestPalind(s){
var maxp_长度=0,
maxp='';
对于(变量i=0;i
检查以确保提供的字符串不是回文。如果是,则完成。(最佳情况)
最坏情况0(n^2)
链接到
使用动态规划。将每个问题分解成自己的方法,然后将每个问题的解决方案相加得到答案
class Palindrome {
constructor(chars){
this.palindrome = chars;
this.table = new Object();
this.longestPalindrome = null;
this.longestPalindromeLength = 0;
if(!this.isTheStringAPalindrome()){
this.initialSetupOfTableStructure();
}
}
isTheStringAPalindrome(){
const reverse = [...this.palindrome].reverse().join('');
if(this.palindrome === reverse){
this.longestPalindrome = this.palindrome;
this.longestPalindromeLength = this.palindrome.length;
console.log('pal is longest', );
return true;
}
}
initialSetupOfTableStructure(){
for(let i = 0; i < this.palindrome.length; i++){
for(let k = 0; k < this.palindrome.length; k++){
this.table[`${i},${k}`] = false;
}
}
this.setIndividualsAsPalindromes();
}
setIndividualsAsPalindromes(){
for(let i = 0; i < this.palindrome.length; i++){
this.table[`${i},${i}`] = true;
}
this.setDoubleLettersPlaindrome();
}
setDoubleLettersPlaindrome(){
for(let i = 0; i < this.palindrome.length; i++){
const firstSubstring = this.palindrome.substring(i, i + 1);
const secondSubstring = this.palindrome.substring(i+1, i + 2);
if(firstSubstring === secondSubstring){
this.table[`${i},${i + 1}`] = true;
if(this.longestPalindromeLength < 2){
this.longestPalindrome = firstSubstring + secondSubstring;
this.longestPalindromeLength = 2;
}
}
}
this.setAnyPalindromLengthGreaterThan2();
}
setAnyPalindromLengthGreaterThan2(){
for(let k = 3; k <= this.palindrome.length; k++){
for(let i = 0; i <= this.palindrome.length - k; i++){
const j = i + k - 1;
const tableAtIJ = this.table[`${i+1},${j-1}`];
const stringToCompare = this.palindrome.substring(i, j +1);
const firstLetterInstringToCompare = stringToCompare[0];
const lastLetterInstringToCompare = [...stringToCompare].reverse()[0];
if(tableAtIJ && firstLetterInstringToCompare === lastLetterInstringToCompare){
this.table[`${i},${j}`] = true;
if(this.longestPalindromeLength < stringToCompare.length){
this.longestPalindrome = stringToCompare;
this.longestPalindromeLength = stringToCompare.length;
}
}
}
}
}
printLongestPalindrome(){
console.log('Logest Palindrome', this.longestPalindrome);
console.log('from /n', this.palindrome );
}
toString(){
console.log('palindrome', this.palindrome);
console.log(this.table)
}
}
// const palindrome = new Palindrome('lollolkidding');
// const palindrome = new Palindrome('acbaabca');
const palindrome = new Palindrome('acbaabad');
palindrome.printLongestPalindrome();
//palindrome.toString();
类回文{
建造师(chars){
this.palindrome=chars;
this.table=新对象();
this.longestPalindrome=null;
this.longestPalindromeLength=0;
如果(!this.isTheStringAPalindrome()){
这是.initialSetupOfTableStructure();
}
}
IsthestingApalindrome(){
常量reverse=[…this.palindrome].reverse().join(“”);
if(this.palindrome==反向){
this.longestPalindrome=this.palindrome;
this.longestPalindromeLength=this.palindrome.length;
log('pal最长',);
返回true;
}
}
initialSetupOfTableStructure(){
for(设i=0;i函数最长回文组(str){
var arr=str.split(“”);
var endArr=[];
对于(变量i=0;i2&&temp===temp.split(“”).reverse().join(“”){
端推(温度);
}
}
}
var计数=0;
var longestPalindrome=“”;
对于(变量i=0;i=endArr[i].长度){
最长回文组=endArr[i-1];
}
否则{
count=endArr[i]。长度;
}
}
控制台日志(endArr);
console.log(最长回文);
返回最长的回文;
}
最长回文(“abracadabra”);
函数最长回文{
如果(s==''){
返回“”
}
设arr=[];
让_s=s.分割(“”);
for(设i=0;i<\u.length;i++){
对于(设j=0;j<_.length;j++){
让word=_.slice(0,j+1).join(“”);
让rev_word=_.slice(0,j+1).reverse().join(“”);
如果(字===修订字){
arr.push(字)
}
}
_s、 拼接(0,1)
}
设_arr=arr.sort((a,b)=>a.length-b.length);
for(设i=0;i<_arr.length;i++){
如果(_arr[arr.length-1].length==_arr[i].length){
返回_arr[i]
}
}
}
最长回文('bbaaacc')
//这段代码将为您提供字符串中第一个最长的回文子字符串YES-这最终是有意义的。当然,您会对回文行执行i+1,因为它们的“中心”是2 i
public string LongestPalindrome(string s) {
return LongestPalindromeSol(s, 0, s.Length-1);
}
public static string LongestPalindromeSol(string s1, int start, int end)
{
if (start > end)
{
return string.Empty;
}
if (start == end)
{
char ch = s1[start];
string s = string.Empty;
var res = s.Insert(0, ch.ToString());
return res;
}
if (s1[start] == s1[end])
{
char ch = s1[start];
var res = LongestPalindromeSol(s1, start + 1, end - 1);
res = res.Insert(0, ch.ToString());
res = res.Insert(res.Length, ch.ToString());
return res;
}
else
{
var str1 = LongestPalindromeSol(s1, start, end - 1);
var str2 = LongestPalindromeSol(s1, start, end - 1);
if (str1.Length > str2.Length)
{
return str1;
}
else
{
return str2;
}
}
}
class Palindrome {
constructor(chars){
this.palindrome = chars;
this.table = new Object();
this.longestPalindrome = null;
this.longestPalindromeLength = 0;
if(!this.isTheStringAPalindrome()){
this.initialSetupOfTableStructure();
}
}
isTheStringAPalindrome(){
const reverse = [...this.palindrome].reverse().join('');
if(this.palindrome === reverse){
this.longestPalindrome = this.palindrome;
this.longestPalindromeLength = this.palindrome.length;
console.log('pal is longest', );
return true;
}
}
initialSetupOfTableStructure(){
for(let i = 0; i < this.palindrome.length; i++){
for(let k = 0; k < this.palindrome.length; k++){
this.table[`${i},${k}`] = false;
}
}
this.setIndividualsAsPalindromes();
}
setIndividualsAsPalindromes(){
for(let i = 0; i < this.palindrome.length; i++){
this.table[`${i},${i}`] = true;
}
this.setDoubleLettersPlaindrome();
}
setDoubleLettersPlaindrome(){
for(let i = 0; i < this.palindrome.length; i++){
const firstSubstring = this.palindrome.substring(i, i + 1);
const secondSubstring = this.palindrome.substring(i+1, i + 2);
if(firstSubstring === secondSubstring){
this.table[`${i},${i + 1}`] = true;
if(this.longestPalindromeLength < 2){
this.longestPalindrome = firstSubstring + secondSubstring;
this.longestPalindromeLength = 2;
}
}
}
this.setAnyPalindromLengthGreaterThan2();
}
setAnyPalindromLengthGreaterThan2(){
for(let k = 3; k <= this.palindrome.length; k++){
for(let i = 0; i <= this.palindrome.length - k; i++){
const j = i + k - 1;
const tableAtIJ = this.table[`${i+1},${j-1}`];
const stringToCompare = this.palindrome.substring(i, j +1);
const firstLetterInstringToCompare = stringToCompare[0];
const lastLetterInstringToCompare = [...stringToCompare].reverse()[0];
if(tableAtIJ && firstLetterInstringToCompare === lastLetterInstringToCompare){
this.table[`${i},${j}`] = true;
if(this.longestPalindromeLength < stringToCompare.length){
this.longestPalindrome = stringToCompare;
this.longestPalindromeLength = stringToCompare.length;
}
}
}
}
}
printLongestPalindrome(){
console.log('Logest Palindrome', this.longestPalindrome);
console.log('from /n', this.palindrome );
}
toString(){
console.log('palindrome', this.palindrome);
console.log(this.table)
}
}
// const palindrome = new Palindrome('lollolkidding');
// const palindrome = new Palindrome('acbaabca');
const palindrome = new Palindrome('acbaabad');
palindrome.printLongestPalindrome();
//palindrome.toString();
This is in JS ES6. much simpler and works for almost all words .. Ive tried radar, redder, noon etc.
const findPalindrome = (input) => {
let temp = input.split('')
let rev = temp.reverse().join('')
if(input == rev){
console.log('Palindrome', input.length)
}
}
//i/p : redder
// "Palindrome" 6
function longestPalindrome(str){
var arr = str.split("");
var endArr = [];
for(var i = 0; i < arr.length; i++){
var temp = "";
temp = arr[i];
for(var j = i + 1; j < arr.length; j++){
temp += arr[j];
if(temp.length > 2 && temp === temp.split("").reverse().join("")){
endArr.push(temp);
}
}
}
var count = 0;
var longestPalindrome = "";
for(var i = 0; i < endArr.length; i++){
if(count >= endArr[i].length){
longestPalindrome = endArr[i-1];
}
else{
count = endArr[i].length;
}
}
console.log(endArr);
console.log(longestPalindrome);
return longestPalindrome;
}
longestPalindrome("abracadabra"));
function longest_palindrome(s) {
if (s === '') {
return ''
}
let arr = [];
let _s = s.split('');
for (let i = 0; i < _s.length; i++) {
for (let j = 0; j < _s.length; j++) {
let word = _s.slice(0, j + 1).join('');
let rev_word = _s.slice(0, j + 1).reverse().join('');
if (word === rev_word) {
arr.push(word)
}
}
_s.splice(0, 1)
}
let _arr = arr.sort((a, b) => a.length - b.length);
for (let i = 0; i < _arr.length; i++) {
if (_arr[arr.length - 1].length === _arr[i].length) {
return _arr[i]
}
}
public string LongestPalindrome(string s) {
return LongestPalindromeSol(s, 0, s.Length-1);
}
public static string LongestPalindromeSol(string s1, int start, int end)
{
if (start > end)
{
return string.Empty;
}
if (start == end)
{
char ch = s1[start];
string s = string.Empty;
var res = s.Insert(0, ch.ToString());
return res;
}
if (s1[start] == s1[end])
{
char ch = s1[start];
var res = LongestPalindromeSol(s1, start + 1, end - 1);
res = res.Insert(0, ch.ToString());
res = res.Insert(res.Length, ch.ToString());
return res;
}
else
{
var str1 = LongestPalindromeSol(s1, start, end - 1);
var str2 = LongestPalindromeSol(s1, start, end - 1);
if (str1.Length > str2.Length)
{
return str1;
}
else
{
return str2;
}
}
}