L2-008 最长对称子串 (25分)

对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。

输入格式:

输入在一行中给出长度不超过1000的非空字符串。

输出格式:

在一行中输出最长对称子串的长度。

输入样例:

Is PAT&TAP symmetric?

输出样例:

11

思路:本题可以有多种方法来解决,动态规划,马拉车等等,但是我更擅长动态规划来解决此题,本题定义一个动态规划数组dp[i][j],表示的意义为字符串从i-j是否为回文串,首先应该确定数组的边界,当字串长度为1时一定为会文串,当子串长度为2时只要判断s[i]是否等于s[j]就可以判断i-j是否为回文串,当字串的长度大于等于2时知道判定s[i]==s[j]和dp[i+1][j-1]>0就可判断是否为回文串,所以本题的状态公式为:      1    i==jdp[i][j]= 2    i-j==1&&str[i]==str[j]        dp[j+1][i-1]+2  str[i]==str[j]&&dp[j+1][i-1]>0

代码:
/**
 *
 */
package com.xingbing.tianti;

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

/**
 * @author 邢兵
 * @data
 * @description
 */
public class L2008 {
	public static void main(String[] args) throws IOException {
		Scanner in = new Scanner(System.in);
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		String str = reader.readLine();
		int dp[][] = new int[str.length()][str.length()];
		int ans =0;
		for(int i=0;i<str.length();i++){
			for(int j=0;j<=i;j++){
				if(i==j){
					dp[j][i] = 1;
				}else if(i-j==1){
					if(str.charAt(i)==str.charAt(j)){
						dp[j][i] = 2;
					}
				}else if(i-j>=2){
					if(str.charAt(i)==str.charAt(j)&&dp[j+1][i-1]>0){
						dp[j][i] = dp[j+1][i-1]+2;
					}
				}
			}
		}
		for(int i=0;i<dp.length;i++){
			for(int j=0;j<dp[0].length;j++){
				ans = Math.max(ans, dp[i][j]);
			}
		}
		System.out.println(ans);
	}
}

  

原文地址:https://www.cnblogs.com/xuesujun/p/12232069.html

时间: 2024-10-12 08:24:00

L2-008 最长对称子串 (25分)的相关文章

L2-008 最长对称子串 (25 分) (模拟)

链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805067704549376 题目: 对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11. 输入格式: 输入在一行中给出长度不超过1000的非空字符串. 输出格式: 在一行中输出最长对称子串的长度. 输入样例: Is PAT&TAP symme

PTA——最长对称子串

PTA 7-64 最长对称子串 1 //流程: 2 //数组存储字符串,指针i从头遍历 3 //str[i-2]==str[i],若相等则记录对称串的长度,同时指针j从i-2开始向后遍历 4 //两个指针所指内容不相等时停止遍历,更新对称串的长度 5 //奇数情况// 6 //变量: 7 //字符数组str 8 //指针i.j 9 //状态变量sys——当前对称串是否在增长 10 //temp——当前对称串长度 11 // lng——当前最长对称串长度 12 //细节: 13 //i从2开始遍历

PAT L2-008. 最长对称子串

题目链接:PAT L2-008. 最长对称子串 题意: 对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s",于是你应该输出11. 题解: 直接枚举中点,暴力一下 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std

L2-008. 最长对称子串

L2-008. 最长对称子串 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s",于是你应该输出11. 输入格式: 输入在一行中给出长度不超过1000的非空字符串. 输出格式: 在一行中输出最长对称子串的长度. 输入样例: Is PAT

天梯杯 L2-008. 最长对称子串(马拉车算法应用)

最长对称子串 对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11. 输入格式: 输入在一行中给出长度不超过1000的非空字符串. 输出格式: 在一行中输出最长对称子串的长度. 马拉车算法: 一)第一步是改造字符串S,变为T,其改造的方法如下: 在字符串S的字符之间和S的首尾都插入一个"#",如:S="abba"变为T="#a#b#b

L2-008. 最长对称子串 (有个知识点没看)

题目: 思路 方法一:判断字符串的每一个子串,若是对称的,则求出它的长度即可.这种办法对每一个子串,从两头向中间判断是不是子串.总的时间复杂度为O(n^3), 下面给出时间复杂度是O(n^2)的思路. 方法二:与方法一正好相反,字符串中的每一个开始,向两边扩展,此时可分为两种情况: (1)对称子串长度是奇数时, 以当前字符为对称轴向两边扩展比较 (2)对称子串长度是偶数时,以当前字符和它右边的字符为对称轴向两边扩展 1 #include <cstdio> 2 #include <cstr

(算法-字符串)最长对称子串

题目: 输入字符串中对称的子字符串的最大长度.比如输入字符串“roorle”,由于该字符串里最长的对称子字符串是“roor”,因此输出4. 思路: 1.求字符串”roorle“和反序”elroor“的最长公共子串 2.最长回文子串 代码: 1.最长公共子串 #include<iostream> using namespace std; // naive method // O(n^3) int comlen(const string &str1,int i,int m,const st

最长对称子串

//求一个字符串中最长对称字串,好像有点如google,那么输出goog /* O(n2)的算法 如果我们换一种思路,我们从里向外来判断.也就是我们先判断子字符串A是不是对称的. 如果A不是对称的,那么向该子字符串两端各延长一个字符得到的字符串肯定不是对称的. 如果A对称,那么我们只需要判断A两端延长的一个字符是不是相等的,如果相等,则延长后的字符串是对称的. 因此在知道A是否对称之后,只需要O(1)的时间就能知道aAa是不是对称的. */ #include <iostream> #inclu

最长对称子串 (最长回文字串) pta 7-12

题目链接https://pintia.cn/problem-sets/1218774283169423360/problems/1218774532776648715 方法一, 见代码 #include <cstdio> #include <iostream> #include <algorithm> #include <string> #include <cstring> #include<cmath> #include<ve