日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

最长回文子串和回文链表

發(fā)布時(shí)間:2024/4/11 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最长回文子串和回文链表 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

回文子串和回文鏈表

文章目錄

    • 回文子串和回文鏈表
    • 一、最長回文子串
      • 1.題目描述
      • 2.分析
      • 3.代碼實(shí)現(xiàn)
    • 二、判斷回文鏈表
      • 1.問題描述
      • 2. 分析
      • 3.代碼
      • 4.優(yōu)化
    • 三、回文子串
      • 1.問題描述
      • 2.代碼

一、最長回文子串

1.題目描述

2.分析

  • 對(duì)于這個(gè)問題,我們首先應(yīng)該思考的是,給一個(gè)字符串 s,如何在 s 中找到一個(gè)回文子串?
  • 有一個(gè)很有趣的思路:既然回文串是一個(gè)正著反著讀都一樣的字符串,那么如果我們把 s 反轉(zhuǎn),稱為 s’,然后在 s 和 s’ 中尋找最長公共子串,這樣應(yīng)該就能找到最長回文子串。
  • 比如說字符串 abacd,反過來是 dcaba,它的最長公共子串是 aba,也就是最長回文子串。
  • 但是這個(gè)思路是錯(cuò)誤的,比如說字符串 aacxycaa,反轉(zhuǎn)之后是 aacyxcaa,最長公共子串是 aac,但是最長回文子串應(yīng)該是 aa。
  • 雖然這個(gè)思路不正確,但是這種把問題轉(zhuǎn)化為其他形式的思考方式是非常值得提倡的。
  • 下面,就來說一下正確的思路,如何使用 雙指針
  • 尋找回文串的問題核心思想是:從中間開始向兩邊擴(kuò)散來判斷回文串。對(duì)于最長回文子串,就是這個(gè)意思:
for 0 <= i < len(s):找到以 s[i] 為中心的回文串更新答案

但是呢,我們剛才也說了,回文串的長度可能是奇數(shù)也可能是偶數(shù),如果是 abba這種情況,沒有一個(gè)中心字符,上面的算法就沒轍了。所以我們可以修改一下:

for 0 <= i < len(s):找到以 s[i] 為中心的回文串找到以 s[i] 和 s[i+1] 為中心的回文串更新答案

3.代碼實(shí)現(xiàn)

string palindrome(string& s, int l, int r) {// 防止索引越界while (l >= 0 && r < s.size() && s[l] == s[r]) {// 向兩邊展開l--; r++;}// 返回以 s[l] 和 s[r] 為中心的最長回文串return s.substr(l + 1, r - l - 1); }

為什么要傳入兩個(gè)指針 l 和 r 呢?因?yàn)檫@樣實(shí)現(xiàn)可以同時(shí)處理回文串長度為奇數(shù)和偶數(shù)的情況:

for 0 <= i < len(s):# 找到以 s[i] 為中心的回文串palindrome(s, i, i)# 找到以 s[i] 和 s[i+1] 為中心的回文串palindrome(s, i, i + 1)更新答案

longestPalindrome完整代碼:

string longestPalindrome(string s) {string res;for (int i = 0; i < s.size(); i++) {// 以 s[i] 為中心的最長回文子串string s1 = palindrome(s, i, i);// 以 s[i] 和 s[i+1] 為中心的最長回文子串string s2 = palindrome(s, i, i + 1);// res = longest(res, s1, s2)res = res.size() > s1.size() ? res : s1;res = res.size() > s2.size() ? res : s2;}return res; }
  • 至此,這道最長回文子串的問題就解決了,時(shí)間復(fù)雜度 O(N^2),空間復(fù)雜度 O(1)。
  • 值得一提的是,這個(gè)問題可以用動(dòng)態(tài)規(guī)劃方法解決,時(shí)間復(fù)雜度一樣,但是空間復(fù)雜度至少要 O(N^2) 來存儲(chǔ) DP table。這道題是少有的動(dòng)態(tài)規(guī)劃非最優(yōu)解法的問題。

二、判斷回文鏈表

1.問題描述

2. 分析

普通暴力求解就不說了!!!

  • 借助二叉樹后序遍歷的思路,不需要顯式反轉(zhuǎn)原始鏈表也可以倒序遍歷鏈表,下面來具體聊聊。
  • 對(duì)于二叉樹的幾種遍歷方式,我們?cè)偈煜げ贿^了:
void traverse(TreeNode root) {// 前序遍歷代碼traverse(root.left);// 中序遍歷代碼traverse(root.right);// 后序遍歷代碼 }
  • 鏈表兼具遞歸結(jié)構(gòu),樹結(jié)構(gòu)不過是鏈表的衍生。那么,鏈表其實(shí)也可以有前序遍歷和后序遍歷:
void traverse(ListNode head) {// 前序遍歷代碼traverse(head.next);// 后序遍歷代碼 }
  • 這個(gè)框架有什么指導(dǎo)意義呢?如果我想正序打印鏈表中的val值,可以在前序遍歷位置寫代碼;反之,如果想倒序遍歷鏈表,就可以在后序遍歷位置操作
/* 倒序打印單鏈表中的元素值 */ void traverse(ListNode head) {if (head == null) return;traverse(head.next);// 后序遍歷代碼print(head.val); }
  • 說到這了,其實(shí)可以稍作修改,模仿雙指針實(shí)現(xiàn)回文判斷的功能:

3.代碼

// 左側(cè)指針 ListNode left;boolean isPalindrome(ListNode head) {left = head;return traverse(head); }boolean traverse(ListNode right) {if (right == null) return true;boolean res = traverse(right.next);// 后序遍歷代碼res = res && (right.val == left.val);left = left.next;return res; }
  • 這么做的核心邏輯是什么呢?實(shí)際上就是把鏈表節(jié)點(diǎn)放入一個(gè)棧,然后再拿出來,這時(shí)候元素順序就是反的,只不過我們利用的是遞歸函數(shù)的堆棧而已。

當(dāng)然,無論造一條反轉(zhuǎn)鏈表還是利用后續(xù)遍歷,算法的時(shí)間和空間復(fù)雜度都是 O(N)。下面我們想想,能不能不用額外的空間,解決這個(gè)問題呢?

4.優(yōu)化

  • 1、先通過「雙指針技巧」中的快慢指針來找到鏈表的中點(diǎn):
ListNode slow, fast; slow = fast = head; while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next; } // slow 指針現(xiàn)在指向鏈表中點(diǎn)

  • 2、如果fast指針沒有指向null,說明鏈表長度為奇數(shù),slow還要再前進(jìn)一步:
if (fast != null)slow = slow.next;

  • 3、從slow開始反轉(zhuǎn)后面的鏈表,現(xiàn)在就可以開始比較回文串了:
ListNode left = head; ListNode right = reverse(slow);while (right != null) {if (left.val != right.val)return false;left = left.next;right = right.next; } return true;


至此,把上面 3 段代碼合在一起就高效地解決這個(gè)問題了,其中reverse函數(shù)很容易實(shí)現(xiàn):

ListNode reverse(ListNode head) {ListNode pre = null, cur = head;while (cur != null) {ListNode next = cur.next;cur.next = pre;pre = cur;cur = next;}return pre; }

  • 算法總體的時(shí)間復(fù)雜度 O(N),空間復(fù)雜度 O(1),已經(jīng)是最優(yōu)的了。
  • 我知道肯定有讀者會(huì)問:這種解法雖然高效,但破壞了輸入鏈表的原始結(jié)構(gòu),能不能避免這個(gè)瑕疵呢?
  • 其實(shí)這個(gè)問題很好解決,關(guān)鍵在于得到p, q這兩個(gè)指針位置:


這樣,只要在函數(shù) return 之前加一段代碼即可恢復(fù)原先鏈表順序:

p.next = reverse(q);
  • 首先,尋找回文串是從中間向兩端擴(kuò)展,判斷回文串是從兩端向中間收縮。
  • 對(duì)于單鏈表,無法直接倒序遍歷,可以造一條新的反轉(zhuǎn)鏈表,可以利用鏈表的后序遍歷,也可以用棧結(jié)構(gòu)倒序處理單鏈表。
  • 具體到回文鏈表的判斷問題,由于回文的特殊性,可以不完全反轉(zhuǎn)鏈表,而是僅僅反轉(zhuǎn)部分鏈表,將空間復(fù)雜度降到 O(1)。

三、回文子串

1.問題描述



2.代碼

#include <bits/stdc++.h> using namespace std;int palindrome(string str,int l,int r) {int count = 0;while(l >= 0 && r < str.size() && str[l] == str[r]){count++;l--;r++;}return count; }int main() {string str;int ret = 0;while(cin>>str){for(int i = 0;i < str.size();i++){int num1 = palindrome(str, i, i);int num2 = palindrome(str, i, i + 1);ret += (num1 + num2);}cout<<ret<<endl;}return 0; }

總結(jié)

以上是生活随笔為你收集整理的最长回文子串和回文链表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩欧美国产激情 | 久久精品成人 | 1024日韩| 女女同性高清片免费看 | 久久天堂视频 | 国产免费无码一区二区视频 | 在线精品福利 | 国产激情在线播放 | 久久久国产精品黄毛片 | 欧美精品一区二区三 | 午夜黄网| 99人妻碰碰碰久久久久禁片 | 丝瓜色版 | 天堂成人av | 蜜臀中文字幕 | 国产网站黄色 | 中文字幕乱码亚洲精品一区 | 国产精品中文字幕在线观看 | 尤物av无码色av无码 | 久久久91| 日韩va亚洲va欧美va久久 | www.久久久 | 亚州欧美| 国产欧美在线观看不卡 | 日本一区二区在线免费观看 | 久久亚洲精品中文字幕 | 91高清无打码 | www视频在线观看免费 | 插插看 | 狠狠躁天天躁夜夜躁婷婷 | 国产精品九九九 | 国产精品18p | 91亚色视频在线观看 | 中文字幕在线视频第一页 | 欧美日韩三区 | 黄色网日本 | 美女丝袜合集 | 欧美色图激情 | 欧美美女色图 | 久久老熟女一区二区三区 | 亚洲一区电影在线观看 | 国产一区二区四区 | 成人在线观看h | 先锋影音中文字幕 | 中文在线字幕免费观看 | 国产二区电影 | 禁漫天堂黄漫画无遮挡观看 | 在线中文字日产幕 | 日韩专区视频 | 成人v片| 91精产国品一二三 | 日韩av在线中文字幕 | 高h视频在线观看 | 激情偷乱人成视频在线观看 | 伊人五月综合 | 欧美男人的天堂 | 亚洲最新av网址 | 日韩视频一区二区三区 | xx在线视频 | 国产丝袜第一页 | 国产成人精品免费 | 理论片琪琪午夜电影 | 欧美日韩中文在线观看 | jizzjizz中国精品麻豆 | 成年人看片网站 | 九九人人 | 99人妻碰碰碰久久久久禁片 | 欧美精品成人久久 | 狠色综合| 探花av在线 | 久久久www成人免费无遮挡大片 | 国产夫绿帽单男3p精品视频 | 国产福利短视频 | 国产猛男猛女超爽免费视频 | 亚洲精品人妻无码 | a天堂资源| 午夜欧美成人 | 久久视频在线观看 | 日本精品视频一区二区 | 99精品视频免费看 | 天天曰夜夜操 | 高潮喷水一区二区三区 | 日本视频中文字幕 | 暧暧视频在线观看 | b站大片免费直播 | 在线观看www视频 | 看av网站| av免费网址在线观看 | 国产午夜精品一区二区三区欧美 | 无码人妻精品一区二区三区夜夜嗨 | 在线v| 免费福利av | 美女尻逼视频 | 99热精品在线播放 | 国产欧美久久久精品免费 | 国产精品成人一区二区网站软件 | 精品在线视频一区二区 | 久伊人| 国产一区中文字幕 |