zoukankan      html  css  js  c++  java
  • 最长回文子串(Longest Palindromic Substring)-DP问题

    问题描述:

    给定一个字符串S,找出它的最大的回文子串,你可以假设字符串的最大长度是1000,而且存在唯一的最长回文子串 。

    思路分析:

    动态规划的思路:dp[i][j] 表示的是 从i 到 j 的字串,是否是回文串。

    则根据回文的规则我们可以知道:

    如果s[i] == s[j] 那么是否是回文决定于 dp[i+1][ j - 1]

    当 s[i] != s[j] 的时候, dp[i][j] 直接就是 false。

    动态规划的进行是按照字符串的长度从1 到 n推进的。

    DP算法实现:

     1 package com.ysw.test;
     2 
     3 import java.util.Scanner;
     4 
     5 /*
     6  * 问题描述:
     7  * 给定一个字符串S,找出它的最大的回文子串,你可以假设字符串的最大长度是1000,
     8  * 而且存在唯一的最长回文子串 。
     9  */
    10 public class LongestPalindrome {
    11 
    12     /**
    13      * @param args
    14      */
    15     public static void main(String[] args) {
    16         // 从键盘读入字符串
    17         String str = null;
    18         Scanner reader = new Scanner(System.in);
    19         str = reader.nextLine();
    20         System.out.println(getLongestPalindrome(str));
    21     }
    22 
    23     /**
    24      * 此方法返回s的最长回文串
    25      * 
    26      * @param str
    27      * @return
    28      */
    29     private static String getLongestPalindrome(String str) {
    30 
    31         boolean dp[][];
    32         // 如果字符串的长度为0,则认为str的最长回文串为空字符串
    33         if (str.length() == 0) {
    34             return "";
    35         }
    36         // 字符串str长度为1.则字符串本身就是一个最长回文串
    37         if (str.length() == 1) {
    38             return str;
    39         }
    40         // dp[i][j],表示字符串str从str[i]到str[j]的子串为最长回文子串
    41         dp = new boolean[str.length()][str.length()];
    42         // 记录已经找到的最长回文子串的长度
    43         int maxLen = 1;
    44         // 记录最长回文子串的起点位置和终点位置
    45         int start = 0, end = 0;
    46         // 动态规划的进行是按照字符串的长度从1 到 n推进的,k表示正在判断的子串的长度
    47         // 用于和已知的子串的长度maxLen进行比较
    48         int k;
    49         // 找出str的所有子串的dp对应的boolean值,初始化过程
    50         for (int i = 0; i < str.length(); i++) {
    51             for (int j = 0; j < str.length(); j++) {
    52                 // 当i==j的时候,只有一个字符的字符串
    53                 // 当i>j的时候认为是空串,dp[i][j]
    54                 if (i >= j) {
    55                     dp[i][j] = true;
    56                 } else {
    57                     dp[i][j] = false;
    58                 }
    59             }
    60         }
    61 
    62         // 我在这里犯了一个幼稚的错误,把i、j的定义放在了for循环中,在else{}中是访问不到的
    63         // 运行程序报java.lang.StringIndexOutOfBoundsException: String index out of
    64         // range错误
    65         int i, j;
    66         for (k = 1; k < str.length(); k++) {
    67             for (i = 0; i + k < str.length(); i++) {
    68 
    69                 j = i + k;
    70                 if (str.charAt(i) != str.charAt(j)) {
    71                     dp[i][j] = false;
    72                 } else {
    73                     dp[i][j] = dp[i + 1][j - 1];
    74                     if (dp[i][j]) {
    75                         // 判断找到的子串的长度是否大于我们已知的最长子串的长度
    76                         if (k + 1 > maxLen) {
    77                             // 记录最长回文子串
    78                             maxLen = k + 1;
    79                             // 记录子串的起始位置,因为后面的函数subString(int beginIndex,int
    80                             // endIndex)函数要用到
    81                             start = i;
    82                             end = j;
    83                         }
    84                     }
    85                 }
    86             }
    87         }
    88         return str.substring(start, end + 1);
    89     }
    90 }

    【注意】:函数subString返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符。因此,该子字符串的长度为 endIndex-beginIndex

  • 相关阅读:
    .NET开发人员遇到Maven
    基于VS Code创建Java command-line app
    IntelliJ IDEA连接TFS local workspace无法正常签入
    Xcode连接TFS Git用户名和密码不正确解决方案
    Fiddler如何捕捉DefaultHttpClient的HTTP请求
    IIS 6的日志time-taken字段没有值的解决方案
    简单的音乐轮播JS
    SpringCloud分布式开发理解
    SpringCloud分布式开发五大神兽
    socket长连接和短链接区别
  • 原文地址:https://www.cnblogs.com/ysw-go/p/5873350.html
Copyright © 2011-2022 走看看