Longest Palindromic Substring

本文介绍了两种寻找字符串中最长回文子串的方法。第一种方法通过遍历字符串来找到所有可能的回文子串,并从中选取最长的一个;第二种方法采用动态规划策略,通过构建布尔矩阵来高效地确定最长回文子串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回文是指正着读和倒着读,结果一些样,比如abcba或abba。

听说有三种方法:

法一:就是我这种呆子能想到的,遍历啊,但时间复杂度应该是O^3,而且算法过程复杂,要是没我的思路清晰,头脑敏捷,不骄不躁,就换下一个方法吧O(∩_∩)O

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Scanner;


public class Five{
public static void longestPalindrome(String s) {

ArrayList<Integer> List = new ArrayList<Integer>();
String temp="0";
for(int i=0;i<s.length();i++)
{
char item1=s.charAt(i);
temp=temp+item1;
for(int j=i+1;j<s.length();j++)
if(s.charAt(j)!=item1)
temp=temp+s.charAt(j);
else
{
temp=temp+s.charAt(j);
int loc = temp.indexOf("0");
String newStr=temp.substring(0,loc);
List.add(newStr);
}
}

String LongestSubstring = null;
for(int k=1;k<List.size();k++)
{
System.out.println((String) List.get(k-1));
if(((String) List.get(k-1)).length()<((String) List.get(k)).length())
LongestSubstring=((String) List.get(k));
else
LongestSubstring=((String) List.get(k-1));
}

System.out.println(LongestSubstring);
}


public static void main(String args[]) throws IOException{
//BufferedReader rd = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入一个字符串:");
Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine();
longestPalindrome(line);


}
}

法二:动态规划。。参考别人的,自己肯定是想不到啦

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Scanner;
public class Five_third{

public static String longestPalindrome(String s) {
if (s == null || s.length() == 0) return "";
int n = s.length();
int max = 0, start = 0, end = 0;
boolean[][] c = new boolean[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
c[i][j] = i >= j ? true : false;
}
}
//c[i][j] 
for (int j = 1; j < n; j++) {
for (int i = 0; i < j; i++) {
if (s.charAt(i) == s.charAt(j) && c[i+1][j-1]) {
c[i][j] = true;
if (j - i + 1 > max) {
max = j - i + 1;
start = i;
end = j;
}
}
else
c[i][j] = false;
}
}

return s.substring(start, end+1);

}
public static void main(String[] args){
System.out.println("请输入一个字符串:");
Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine();
String ins=longestPalindrome(line);
System.out.println(ins);




}
}

转载于:https://www.cnblogs.com/maowuyu-xb/p/6041011.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值