5. Longest Palindromic Substring

更新:

之前那種dp太笨重了有個非常的輕巧的做法,原理都是一樣的。

轉移方程不變,但是不需要特別的初始化

判斷某個格子是不是true,是

  1.要么長度小于3,要么dp[start+1][end-1]==true

  2.并且s.charAt(start) == s.charAt(end)

判斷要不要更新resultStr:

  在dp[start][end] == true的情況下

    1.要么resultStr.length() == 0,就是一次都沒有賦值過

    2.要么resultStr.length() < end - start + 1

  更新resultStr

?

 1     public String longestPalindrome(String s) {
 2         String res = "";
 3         if(s == null || s.length() == 0) {
 4             return res;
 5         }
 6         int len = s.length();
 7         boolean[][] dp = new boolean[len][len];
 8         for(int l = 0; l < len; l++) {
 9             for(int start = 0; start < len - l; start++) {
10                 int end = start + l; 
11                 dp[start][end] = end - start < 2 || (dp[start + 1][end - 1] && s.charAt(start) == s.charAt(end));
12                 if(dp[start][end] && res.length() < end - start + 1) {
13                     res = s.substring(start, end + 1);
14                 }
15             }
16         }
17         return res;
18     }

?

?

?

________________________________________________________________

方法一:動態規劃

基本公式:

matrix[i][j] = true, if matrix[i+1][j-1] == true && str[i] == str[j]

matrix[i][j] = false, otherwise

?

初始化,需要把長度為1和2的串先標好true/false

思路:

1. 初始化:

  1)標記所有長度為1的子串為真:對于所有matrix[i][i]=true

  2) 標記所有長度為2的子串的真假:對于所有matrix[i][i+1] = str[i] == str[i+1]

2.填寫matrix:

對于長度len從2到strLen:

  對于位置i從0到strLen-len:

    如果?matrix[i+1][j-1] == true && str[i] == str[j],那么

       matrix[i][j]=true

    否則

      matrix[i][j] = false

3. 尋找最大長度回文子串:

對于i從0到len:

  對于j從i到len:

    如果matrix[i][j] == true:

      如果j-i大于maxLen:

        記錄maxLen

        記錄目前最大回文子串

4.返回全局最大回文子串

 1 public String longestPalindrome(String s) {
 2         if(s == null || s.length() == 0) {
 3             return null;
 4         }
 5         int len = s.length();
 6         if(len == 1) {
 7             return s;
 8         }
 9         boolean[][] matrix = new boolean[len][len];
10         for(int i = 0; i < len; i++) {
11             matrix[i][i] = true;
12         }
13         for(int i = 0; i < len - 1; i++) {
14             matrix[i][i+1] = s.charAt(i) == s.charAt(i+1);
15         }
16         for(int l = 2; l < len; l++) {
17             for(int i = 0; i < len - l; i++) {
18                 if(matrix[i+1][i+l-1] == true && s.charAt(i) == s.charAt(i+l)) {
19                     matrix[i][i+l] = true;
20                 } else {
21                     matrix[i][i+l] = false;
22                 }
23             }
24         }
25         int maxLen = 0;
26         String res = "";
27         for(int i = 0; i < len; i++) {
28             for(int j = i; j < len; j++) {
29                 if(matrix[i][j] == true) {
30                     if(maxLen < j - i) {
31                         maxLen = j - i;
32                         res = s.substring(i, j+1);
33                     }
34                 }
35             }
36         }
37         return res;
38     }

注意事項:

string.substring(i,j)是包括第i個,但是不包括第j個

?

?

方法二:暴力解決

對于字符串里面的每一位/每一位+后一位當做中心,來對回文字符串進行拓展,直到找到最長的

 1     private int startPos = 0;
 2     private int maxLen = 0;
 3     public String longestPalindrome(String s) {
 4         if(s == null) {
 5             return null;
 6         }
 7         int length = s.length();
 8         if(length < 2) {
 9             return s;
10         }
11         for(int i = 0; i < length - 1; i++) {
12             extend(s, i, i);
13             extend(s, i, i+1);
14         }
15         System.out.println(startPos+ ";;" + maxLen);
16         return s.substring(startPos, startPos + maxLen);
17     }
18     
19     private void extend(String s, int left, int right) {
20         while(left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
21             left--;
22             right++;
23         }
24         if(maxLen < right - left - 1) {
25             maxLen = right - left - 1;
26             startPos = left + 1;
27         }
28     }

bug記錄:

20行處,最后執行是多執行了一次,所以后面24行處,要往內移動一格

?

轉載于:https://www.cnblogs.com/warmland/p/5165085.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373709.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373709.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373709.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java中的定制國際化(i18n)

國際化&#xff08;i18n&#xff09;在我們的軟件項目中非常重要。 它主要帶來以下好處&#xff1a; 將UI字符串外部化為除代碼文件之外的外部文件&#xff0c;以及易于管理的UI內容。 支持多種語言。 在這篇文章中&#xff0c;將為Eclipse和Java項目提供一個簡短的i18n實際示…

SEO 百度后臺主動推送鏈接

實踐步驟&#xff0c;先用爬蟲程序將本網站的所有連接爬取出來&#xff0c;再用python文件處理程序把爬蟲來的東東整理成一行一個鏈接的文本格式。再用postman接口測試工具&#xff0c;使用post方式&#xff0c;將所有的鏈接post過去&#xff0c;這樣主動推送是最為快速的提交方…

linux版本 如何查kali_000_Kali Linux版本查看和apt源配置

1.查看系統版本# cat /etc/issue# lsb_release -a2.查看內核信息# uname -a3.更新源# cp /etc/apt/source.list{,.bak}# vim /etc/apt/sources.list//備注&#xff1a;國外源速度太慢&#xff0c;這里禁止&#xff1b;網絡中的部分源已經過期&#xff0c;建議更換其它源。# kal…

nyoj--127--星際之門(一)(生成樹的數量)

星際之門&#xff08;一&#xff09; 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB難度&#xff1a;3描述公元3000年&#xff0c;子虛帝國統領著N個星系&#xff0c;原先它們是靠近光束飛船來進行旅行的&#xff0c;近來&#xff0c;X博士發明了星際之門&…

Oracle 常用的一些函數

字符函數 SELECT UPPER(hello WORLD) FROM DUAL; //將小寫字母變為大寫字母SELECT LOWER(hello WORLD) FROM DUAL; //將大寫字母變為小心字母SELECT INITCAP(hello WORLD) FROM DUAL; //將字符串的首字母大寫SELECT CONCAT(hello, world) FROM DUAL; //字符串拼…

Apache Camel 2.9發布–十大變化

在2011年的最后一天&#xff0c;阿帕奇駱駝制品被成功地推到了中央行銷倉庫&#xff0c;距離香檳酒瓶破裂并進入2012年僅1.5個小時之遙。 2.9版是創紀錄的發行版&#xff0c;自5個月前發布2.8版以來&#xff0c;已解決了約500張JIRA票證。 以下是10個最明顯的改進和新功能的分…

HTML5筆記——formData

注&#xff1a;formData中的數據在控制臺上的console里面是打印不出來的&#xff0c;只能在控制臺的network里面查看到具體的發送數據和發送選項 文章出處&#xff1a;夢想天空 XMLHttpRequest Level 2 添加了一個新的接口——FormData。利用 FormData 對象&#xff0c;我們可以…

JavaScript 學習隨記——==和===及常見元素的真假值

“” 和 “” 符合的使用 <script>/*** 表示可以經過自動轉換&#xff0c;比較的是數值*///example01if(1 true && false 0 && true 1){console.log(1true);console.log(" 比較的是等號兩邊數據的值是否相等&#xff08;可以經過自動轉換&#…

運維祈求不宕機_[國慶特輯] 程序員應該求誰保佑才能保證不宕機?

一年國慶又到&#xff5e;程序猿、運維工程師、利用假期該結婚的結婚&#xff0c;該回老家的回老家。產品經理、項目經理們也要出國旅游了(好像這次是去東京玩)&#xff0c;并且叮囑一定要安排好值班表。我是個程序員&#xff0c;我也想出國旅游&#xff0c;卻覺得有點兒貴。多…

Oracle Weblogic 11g(10.3.4)的小知識

本周&#xff0c;我將為Weblogic進行許多設置和配置&#xff08;我猜是開發人員&#xff09;。 在過去的4年中&#xff0c;我一直在與Weblogic合作&#xff0c;并且我不得不承認-與Eclipse類似-我已經開始使用它。 我曾經是Netbeans / JBoss開發人員&#xff0c;后來轉向Eclips…

java中HashMap的用法

重點介紹HashMap。首先介紹一下什么是Map。在數組中我們是通過數組下標來對其內容索引的&#xff0c;而在Map中我們通過對象來對對象進行索引&#xff0c;用來索引的對象叫做key&#xff0c;其對應的對象叫做value。在下文中會有例子具體說明。 再來看看HashMap和TreeMap有什么…

關于 MVCC 的基礎

作為第一篇對 MVCC 的學習材料&#xff0c;以下內容翻譯自 Wikipedia。 1. 什么是MVCC 1.1 基礎概念 MVCC&#xff0c;Multi-Version Concurrency Control&#xff0c;多版本并發控制。MVCC 是一種并發控制的方法&#xff0c;一般在數據庫管理系統中&#xff0c;實現對數據庫的…

集成測試CDI 1.0和Spring 3.1中的作用域bean

在這篇博客文章中&#xff0c;我描述了如何在Spring和CDI中使用作用域bean進行集成測試。 一切都用小代碼示例進行說明。 使用范圍進行集成測試并不是特別容易。 想象一下存在于會話范圍內的bean&#xff0c;例如UserCredentials 。 在集成測試中&#xff0c;通常沒有HttpReque…

JavaScript學習隨記——數組一

數組的創建及length屬性 <script type"text/javascript" charset"utf-8">// 數組創建方式一,此種方式寫的時候比較麻煩var arrnew Array();// 數組創建方式二var arr [1,2,3,4,true,str,new Date()];console.log("arr.length&#xff1a;"…

USACO milk4 枚舉答案再檢驗

剛開始寫了一個暴力的dfs超時了&#xff0c; 最后看了下題解說是先枚舉答案再判斷&#xff0c;然后就寫了雙dfs&#xff0c;全部秒殺&#xff0c;代碼如下&#xff1a; /*ID: m1500293LANG: CPROG: milk4 */ #include <cstdio> #include <cstring> #include <al…

微信小程序常見問題集合(長期更新)

最新更新&#xff1a; 新手跳坑系列&#xff1a;推薦閱讀&#xff1a;《二十四》request:fail錯誤&#xff08;含https解決方案&#xff09;&#xff08;真機預覽問題 跳坑指南《七十》如何讓微信小程序服務類目審核通過跳坑六十九&#xff1a;uploadFile:fail Error: unable t…

mysql指令按順序排列_mysql基本語法大全

1.備份數據庫&#xff1a;1.1備份數據庫中的表:mysqldump -u root -p test a b >d:\bank_a.sql//分別備份數據庫test下a和b表1.2備份一個數據庫mysqldump -u root -p test > d:\testbk.sql1.3備份多個數據庫mysqldump -u root -p --databases test mysql > D:\data.sq…

Spring和石英:多作業計劃服務

作業調度對于應用程序來說是如此重要。 尤其是在大型項目中&#xff0c;處理大量工作可能是一個問題。 Spring和Quartz為解決該問題帶來了巨大的好處。 本文介紹了如何通過使用Spring和Quartz輕松地計劃多個作業。 二手技術&#xff1a; JDK 1.6.0_21 春天3.1.1 石英1.8.5 M…

JavaScript學習隨記——數組二

數組indexOf(arg) 和 lastIndexOf(arg)方法使用 <script type"text/javascript" charset"utf-8">/*** indexOf(arg):返回指定參數在數組中的索引位置&#xff08;從前往后查&#xff0c;比較是使用 ‘’&#xff0c;查詢到立即返回索引位置&#xff…

反射的簡單應用

首先有一個類 1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 using System.Threading.Tasks;6 7 namespace ConsoleApplication18 {9 public class demo 10 { 11 public string name "程序員"; 12…