最长回文子串

最长回文子串

题目描述

对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。

给定字符串A以及它的长度n,请返回最长回文子串的长度。

测试样例:
"abc1234321ab",12
返回:7

思路:

回文串分成两种类型,奇数长度 和 偶数长度。

如果串S有某个回文子串sub(i, j),这里的i,j 表示回文字串的起始坐标和结束坐标。则,如果 S[i-1] == S[j+1],那么sub(i-1, j+1)也是一个回文子串。


首先,使用一个队列 加入 长度为1的回文子串,以及长度为2的回文子串

接着,如果队列不为空,从队列取出一个元素,即一个回文子串,判断这个回文子串能够扩展,如果能,则把新的回文子串加入队列。继续处理队列。


C++

#include "stdafx.h"
#include
#include
#include 

using namespace std;

class Palindrome {
public:
	int getLongestPalindrome(string A, int n) {
		// write code here
		int longest = 0;

		queue > q;
		for (int i = 1; i < n - 1; i++) {
			q.push(pair(i, i));
		}

		for (int i = 1; i < n; i++) {
			if (A[i - 1] == A[i]) {
				q.push(pair(i - 1, i));
			}
		}

		while (!q.empty()) {
			pair p = q.front();
			q.pop();
			int index1 = p.first - 1;
			int index2 = p.second + 1;
			if (index1 >= 0 && index2 < n && A[index1] == A[index2]) {
				longest = index2 - index1 + 1;
				q.push(pair(index1, index2));
			}
		}
		return longest;
	}
};

int main()
{
	string str;
	while (getline(cin, str)) {
		int pos = str.find(",");
		string sub = str.substr(1, pos - 2);
		string sub2 = str.substr(pos + 1, str.size() - pos);
		int n = stoi(sub2);
		Palindrome p = Palindrome();
		int len = p.getLongestPalindrome(sub, n);
		cout << len << endl;
	}
	return 0;
}

语言注意:

使用到头文件

使用string的find方法,查找匹配字符

使用string的substr方法,截取子串

使用queue保存已经知道的回文子串,三个函数 q.push();q.front();q.pop()分别元素进队尾,获得队首元素、弹出队首元素。

使用pair保存回文子串的两个下标,p.first;p.second访问元素。

Java:

package algo;

import java.util.*;

public class Palindrome {
	public int getLongestPalindrome(String A, int n) {
		// write code here
		int len = 1;
		LinkedList q = new LinkedList();
		for (int i = 1; i < n; i++) {
			q.push(new Pair(i, i));
			if (A.charAt(i-1) == A.charAt(i)) {
				len = 2;
				q.add(new Pair(i - 1, i));
			}
		}

		while (!q.isEmpty()) {
			Pair p = q.removeFirst();
			int low = p.fst - 1;
			int high = p.snd + 1;
			if (low >= 0 && high < n && A.charAt(low) == A.charAt(high)) {
				len = high - low + 1;
				q.add(new Pair(low, high));
			}
		}
		return len;
	}

	public static class Pair {
		int fst;
		int snd;

		Pair(int f, int s) {
			fst = f;
			snd = s;
		}

	}
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while(true) {
			String s = scanner.nextLine();
			String[] substr = s.split(",");
			System.out.println(substr[0]);
			System.out.println(substr[1]);
			String A = substr[0].substring(1, substr[0].length()-1);
			int n = Integer.parseInt(substr[1]);
			Palindrome p = new Palindrome();
			int len = p.getLongestPalindrome(A, n);
			System.out.println(len);
		}
	}

}

语言注意:

LinkedList的 add方法添加元素到队尾,removeFirst方法删除并获取队首元素。


Go语言:

package main

import (
	"bufio"
	"container/list"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	//	str, n := "abc1234321ab", 12
	reader := bufio.NewReader(os.Stdin)
	strBytes, _, _ := reader.ReadLine()
	str := string(strBytes)
	strs := strings.Split(str, ",")
	fmt.Println(strs)
	var A string = strings.Replace(strs[0], "\"", "", -1)
	var strn = strings.Replace(strs[1], " ", "", -1)

	n, _ := strconv.Atoi(strn)

	maxLen := getLongestPalindrome(A, n)
	fmt.Println(maxLen)
}

func getLongestPalindrome(A string, n int) int {
	maxLen := 0
	q := list.New()
	for i := 1; i < len(A); i++ {
		p := new(Pair)
		p.fst, p.snd = i, i
		q.PushBack(p)
		if A[i-1] == A[i] {
			p := new(Pair)
			p.fst, p.snd = i-1, i
			q.PushBack(p)
		}
	}
	for q.Len() > 0 {
		p := q.Remove(q.Front()).(*Pair)
		low := p.fst - 1
		high := p.snd + 1
		if low >= 0 && high < n && A[low] == A[high] {
			maxLen = high - low + 1
			p := new(Pair)
			p.fst, p.snd = low, high
			q.PushBack(p)
		}
	}
	return maxLen
}

type Pair struct {
	fst int
	snd int
}

语言注意:

由接口强制转换到指定类型写法.(type)。

例如某个变量 variable,已经知道它确切类型是int,则v1:= variable.(int);如果是stirng,则v2 := variable.(string)

new关键字可以创建任意类型的对象,并返回指向这个对象的指针;而make只能是创建内嵌类型,返回的是对象,不是指针。

list.New()创建新的链表,并返回指针;l.PushBack(),l.Front(),l.Remove()

Python:

# *-utf8-*

from collections import deque


def palindrome(A, n):
    q  = deque()
    maxLen = 0
    for i in range(1, len(A)):
        q.append((i, i))
        if A[i-1] == A[i]:
            q.append((i-1, i))
    while len(q) != 0:
        low, high = q.popleft();
        low = low - 1
        high = high + 1
        if low >= 0 and high < n and A[low] == A[high]:
            if maxLen < high - low + 1:
                maxLen = high - low + 1
            q.append((low, high))

    return maxLen

        

if __name__ == "__main__":
    #str, n := "abc1234321ab", 12
    # str, n = "baabccc",7
    while True:
        str = input()
        strs = str.split(",")
        A = strs[0].replace('"', "")
        n = int(strs[1])
        maxLen = palindrome(A, n)
        print(maxLen)



你可能感兴趣的:(C/C++,Golang,算法,python)