对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
给定字符串A以及它的长度n,请返回最长回文子串的长度。
"abc1234321ab",12
返回:7
回文串分成两种类型,奇数长度 和 偶数长度。
如果串S有某个回文子串sub(i, j),这里的i,j 表示回文字串的起始坐标和结束坐标。则,如果 S[i-1] == S[j+1],那么sub(i-1, j+1)也是一个回文子串。
首先,使用一个队列 加入 长度为1的回文子串,以及长度为2的回文子串
接着,如果队列不为空,从队列取出一个元素,即一个回文子串,判断这个回文子串能够扩展,如果能,则把新的回文子串加入队列。继续处理队列。
#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访问元素。
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方法删除并获取队首元素。
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()
# *-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)