国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【動(dòng)態(tài)規(guī)劃】【字符串】132.分割回文串 II

這篇具有很好參考價(jià)值的文章主要介紹了【動(dòng)態(tài)規(guī)劃】【字符串】132.分割回文串 II。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

作者推薦

視頻算法專題

本文涉及知識(shí)點(diǎn)

動(dòng)態(tài)規(guī)劃匯總
字符串

LeetCode132. 分割回文串 II

給你一個(gè)字符串 s,請(qǐng)你將 s 分割成一些子串,使每個(gè)子串都是回文。
返回符合要求的 最少分割次數(shù) 。
示例 1:
輸入:s = “aab”
輸出:1
解釋:只需一次分割就可將 s 分割成 [“aa”,“b”] 這樣兩個(gè)回文子串。
示例 2:
輸入:s = “a”
輸出:0
示例 3:
輸入:s = “ab”
輸出:1
提示:
1 <= s.length <= 2000
s 僅由小寫英文字母組成

動(dòng)態(tài)規(guī)劃

分兩步:
一,枚舉回文的中心,記錄所有的回文。空間復(fù)雜度和時(shí)間復(fù)雜度都是O(nn)。
二,通過(guò)動(dòng)態(tài)規(guī)劃計(jì)算所有所有前綴可以差分成多少個(gè)不重疊的子字符串??臻g復(fù)雜度O(n),時(shí)間復(fù)雜度是O(nn)。

變量解析

vRightToLeft(m_c) vRightToLeft[i] 包括元素j,表示s[i,j],是回文串。 vRightToLeft不重復(fù)遺漏的記錄所有回文串。
dp[i] 記錄s[0,i]最少可以劃分成多少個(gè)不重疊的回文子串

態(tài)規(guī)范分析

動(dòng)態(tài)規(guī)劃的狀態(tài)表示 dp[i]記錄s[0,i]最少可以劃分成多少個(gè)不重疊不遺漏的回文子串
動(dòng)態(tài)規(guī)劃的轉(zhuǎn)移方程 如果s[left,i]是回文,dp[i]=min(dp[i],dp[left-1]+1)
動(dòng)態(tài)規(guī)劃的初始狀態(tài) 全部為INT_MAX
動(dòng)態(tài)規(guī)劃的填表順序 i從小到大。由短到長(zhǎng)處理子字符串,確保動(dòng)態(tài)規(guī)劃的無(wú)后效性
動(dòng)態(tài)規(guī)劃的返回值 dp.back()-1

代碼

核心代碼

class Solution {
public:
	int minCut(string s) {
		m_c = s.length();
		vector<vector<int>> vRightToLeft(m_c);//cRightToLeft[i] 包括元素j,表示s[i,j],是回文串。
		for (int i = 0; i < m_c; i++)
		{
			for (int left = i, right = i; (left >= 0) && (right < m_c)&&(s[left]==s[right]); left--, right++)
			{//奇數(shù)長(zhǎng)度回文
				vRightToLeft[right].emplace_back(left);
			}
			for (int left = i, right = i+1; (left >= 0) && (right < m_c) && (s[left] == s[right]); left--, right++)
			{//偶數(shù)長(zhǎng)度回文
				vRightToLeft[right].emplace_back(left);
			}
		}
		vector<int> dp(m_c,INT_MAX);
		for (int i = 0; i < m_c; i++)
		{
			for (const auto& left : vRightToLeft[i])
			{
				dp[i] = min(dp[i], 1 + (left > 0 ? dp[left - 1] : 0));
			}
		}
		return dp.back()-1;
	}
	int m_c;
};

測(cè)試用例

template<class T>
void Assert(const T& t1, const T& t2)
{
	assert(t1 == t2);
}

template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{
	if (v1.size() != v2.size())
	{
		assert(false);
		return;
	}
	for (int i = 0; i < v1.size(); i++)
	{
		Assert(v1[i], v2[i]);
	}
}


int main()
{
	string s;	
	{
		Solution sln;
		s = "aab";
		auto res = sln.minCut(s);
		Assert(1, res);
	}
	{
		Solution sln;
		s = "a";
		auto res = sln.minCut(s);
		Assert(0, res);
	}
	{
		Solution sln;
		s = "ab";
		auto res = sln.minCut(s);
		Assert(1, res);
	}
}

2023年1月版

class Solution {
public:
int minCut(string s) {
m_c = s.length();
vector<vector> is;
is.assign(m_c, vector(m_c+1));
for (int c = 0; c < m_c; c++)
{
//長(zhǎng)度為1的字符串一定是回文
is[c][1] = true;
}
for (int c = 0; c + 1 < m_c; c++)
{
is[c][2] = (s[c] == s[c + 1]);
}
for (int len = 3; len <= m_c; len++)
{
for (int c = 0; c + len - 1 < m_c; c++)
{
is[c][len] = is[c + 1][len - 2] && (s[c] == s[c + len - 1]);
}
}
//最少多少個(gè)回文構(gòu)成
vector dp(m_c + 1,INT_MAX);
dp[0] = 0;
for (int c = 0; c < m_c; c++)
{
for (int len = 1; len <= m_c; len++)
{
if (is[c][len] && (c+len <= m_c ))
{
dp[c + len] = min(dp[c + len], dp[c] + 1);
}
}
}
return dp[m_c] - 1;
}
int m_c;
};

2023年8月

//馬拉車計(jì)算回文回文
class CPalindrome
{
public:
//vOddHalfLen[i]表示 以s[i]為中心,且長(zhǎng)度為奇數(shù)的最長(zhǎng)回文的半長(zhǎng),包括s[i]
//比如:“aba” vOddHalfLen[1]為2 “abba” vEvenHalfLen[1]為2
static void Do(vector& vOddHalfLen, vector& vEvenHalfLen,const string& s)
{
vector v;
for (const auto& ch : s)
{
v.emplace_back(ch);
v.emplace_back(‘*’);
}
v.pop_back();
const int len = v.size();
vector vHalfLen(len);
int center = -1, r = -1;
//center是對(duì)稱中心,r是其右邊界(閉)
for (int i = 0; i < len; i++)
{
int tmp = 1;
if (i <= r)
{
int pre = center - (i - center);
tmp = min(vHalfLen[pre], r - i + 1);
}
for (tmp++; (i + tmp - 1 < len) && (i - tmp + 1 >= 0) && (v[i + tmp - 1] == v[i - tmp + 1]); tmp++);
vHalfLen[i] = --tmp;
const int iNewR = i + tmp - 1;
if (iNewR > r)
{
r = iNewR;
center = i;
}
}
vOddHalfLen.resize(s.length());
vEvenHalfLen.resize(s.length());
for (int i = 0; i < len; i++)
{
if (i & 1)
{
vEvenHalfLen[i / 2] = vHalfLen[i] / 2;

		}
		else
		{
			vOddHalfLen[i / 2] = (vHalfLen[i]+1) / 2 ;				
		}
	}
}

};
class Solution {
public:
int minCut(string s) {
m_c = s.length();
vector vOddHalfLen, vEvenHalfLen;
CPalindrome::Do(vOddHalfLen, vEvenHalfLen,s);
//鄰接表
vector<vector> vNeiBo(m_c+1);
for (int i = 0; i < m_c; i++)
{
for (int len = 1; len <= vOddHalfLen[i]; len++)
{
const int cur = i - len + 1;
const int next = i + len;
vNeiBo[cur].emplace_back(next);
}
for (int len = 1; len <= vEvenHalfLen[i]; len++)
{
const int cur = i - len + 1;
const int next = i + len+1;
vNeiBo[cur].emplace_back(next);
}
}
queue que;
que.emplace(0);
vector vDis(m_c+1, -1);
vDis[0] = 0;
while (que.size())
{
const int cur = que.front();
que.pop();
const int curDis = vDis[cur];
for (const auto& next : vNeiBo[cur])
{
if (-1 != vDis[next])
{
continue;
}
vDis[next] = curDis + 1;
que.emplace(next);
}
}
return vDis.back() - 1;
}
int m_c;
};

【動(dòng)態(tài)規(guī)劃】【字符串】132.分割回文串 II,# 算法題,動(dòng)態(tài)規(guī)劃,算法,c++,leetcode,字符串,回文,馬拉車

擴(kuò)展閱讀

視頻課程

有效學(xué)習(xí):明確的目標(biāo) 及時(shí)的反饋 拉伸區(qū)(難度合適),可以先學(xué)簡(jiǎn)單的課程,請(qǐng)移步CSDN學(xué)院,聽白銀講師(也就是鄙人)的講解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成戰(zhàn)斗了,為老板分憂,請(qǐng)學(xué)習(xí)C#入職培訓(xùn)、C++入職培訓(xùn)等課程
https://edu.csdn.net/lecturer/6176

相關(guān)下載

想高屋建瓴的學(xué)習(xí)算法,請(qǐng)下載《喜缺全書算法冊(cè)》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想對(duì)大家說(shuō)的話
聞缺陷則喜是一個(gè)美好的愿望,早發(fā)現(xiàn)問題,早修改問題,給老板節(jié)約錢。
子墨子言之:事無(wú)終始,無(wú)務(wù)多業(yè)。也就是我們常說(shuō)的專業(yè)的人做專業(yè)的事。
如果程序是一條龍,那算法就是他的是睛

測(cè)試環(huán)境

操作系統(tǒng):win7 開發(fā)環(huán)境: VS2019 C++17
或者 操作系統(tǒng):win10 開發(fā)環(huán)境: VS2022 C++17
如無(wú)特殊說(shuō)明,本算法用**C++**實(shí)現(xiàn)。

【動(dòng)態(tài)規(guī)劃】【字符串】132.分割回文串 II,# 算法題,動(dòng)態(tài)規(guī)劃,算法,c++,leetcode,字符串,回文,馬拉車文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-779368.html

到了這里,關(guān)于【動(dòng)態(tài)規(guī)劃】【字符串】132.分割回文串 II的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【算法|動(dòng)態(tài)規(guī)劃No.28】leetcode1312. 讓字符串成為回文串的最少插入次數(shù)

    【算法|動(dòng)態(tài)規(guī)劃No.28】leetcode1312. 讓字符串成為回文串的最少插入次數(shù)

    個(gè)人主頁(yè):兜里有顆棉花糖 歡迎 點(diǎn)贊?? 收藏? 留言? 加關(guān)注??本文由 兜里有顆棉花糖 原創(chuàng) 收錄于專欄【手撕算法系列專欄】【LeetCode】 ??本專欄旨在提高自己算法能力的同時(shí),記錄一下自己的學(xué)習(xí)過(guò)程,希望對(duì)大家有所幫助 ??希望我們一起努力、成長(zhǎng),共同進(jìn)步。

    2024年02月06日
    瀏覽(23)
  • Leetcode 第 108 場(chǎng)雙周賽 Problem C 將字符串分割為最少的美麗子字符串(動(dòng)態(tài)規(guī)劃)

    Leetcode 第 108 場(chǎng)雙周賽 Problem C 將字符串分割為最少的美麗子字符串(動(dòng)態(tài)規(guī)劃) 題目 給你一個(gè)二進(jìn)制字符串 s ,你需要將字符串分割成一個(gè)或者多個(gè) 子字符串 ,使每個(gè)子字符串都是 美麗 的。 如果一個(gè)字符串滿足以下條件,我們稱它是 美麗 的: 它不包含前導(dǎo) 0 。 它是

    2024年02月15日
    瀏覽(23)
  • 動(dòng)態(tài)規(guī)劃-分割回文串 II

    動(dòng)態(tài)規(guī)劃-分割回文串 II

    跟著九章侯老師學(xué)習(xí)了動(dòng)態(tài)規(guī)劃專題之后根據(jù)學(xué)習(xí)所總結(jié): 給你一個(gè)字符串 s,請(qǐng)你將 s 分割成一些子串,使每個(gè)子串都是回文。 返回符合要求的 最少分割次數(shù) 。 輸入:s = “aab” 輸出:1 解釋:只需一次分割就可將 s 分割成 [“aa”,“b”] 這樣兩個(gè)回文子串。 輸入:s = “

    2024年02月10日
    瀏覽(15)
  • 動(dòng)態(tài)規(guī)劃(一) 變態(tài)青蛙跳臺(tái)階、最大連續(xù)子數(shù)組和、字符串分割 附源碼講解

    動(dòng)態(tài)規(guī)劃(一) 變態(tài)青蛙跳臺(tái)階、最大連續(xù)子數(shù)組和、字符串分割 附源碼講解

    實(shí)現(xiàn) import java.util.*; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); while (scan.hasNext()){ int length = scan.nextInt(); int[] array = new int[length]; for (int i = 0; i length; i++) { array[i] = scan.nextInt(); } System.out.println(findResult(array)); } } private static int findResult(int[] array) {

    2024年04月17日
    瀏覽(26)
  • c++:string相關(guān)的oj題(415. 字符串相加、125. 驗(yàn)證回文串、541. 反轉(zhuǎn)字符串 II、557. 反轉(zhuǎn)字符串中的單詞 III)

    c++:string相關(guān)的oj題(415. 字符串相加、125. 驗(yàn)證回文串、541. 反轉(zhuǎn)字符串 II、557. 反轉(zhuǎn)字符串中的單詞 III)

    傳送門 首先,定義兩個(gè)指針 index1 和 index2 分別指向兩個(gè)輸入字符串的最后一位,用來(lái)從后往前遍歷字符串。 然后定義一個(gè)變量 next 用來(lái)表示進(jìn)位,初始化為 0。 接下來(lái)使用一個(gè)循環(huán)來(lái)遍歷兩個(gè)字符串,直到 index1 和 index2 都小于 0。在循環(huán)中,每次取出 index1 和 index2 對(duì)應(yīng)位置

    2024年01月23日
    瀏覽(31)
  • 【動(dòng)態(tài)規(guī)劃】【字符串】擾亂字符串

    【動(dòng)態(tài)規(guī)劃】【字符串】擾亂字符串

    視頻算法專題 動(dòng)態(tài)規(guī)劃匯總 字符串 使用下面描述的算法可以擾亂字符串 s 得到字符串 t : 如果字符串的長(zhǎng)度為 1 ,算法停止 如果字符串的長(zhǎng)度 1 ,執(zhí)行下述步驟: 在一個(gè)隨機(jī)下標(biāo)處將字符串分割成兩個(gè)非空的子字符串。即,如果已知字符串 s ,則可以將其分成兩個(gè)子字符

    2024年02月03日
    瀏覽(24)
  • 【學(xué)會(huì)動(dòng)態(tài)規(guī)劃】環(huán)繞字符串中唯一的子字符串(25)

    【學(xué)會(huì)動(dòng)態(tài)規(guī)劃】環(huán)繞字符串中唯一的子字符串(25)

    目錄 動(dòng)態(tài)規(guī)劃怎么學(xué)? 1. 題目解析 2. 算法原理 1. 狀態(tài)表示 2. 狀態(tài)轉(zhuǎn)移方程 3. 初始化 4. 填表順序 5. 返回值 3. 代碼編寫 寫在最后: 學(xué)習(xí)一個(gè)算法沒有捷徑,更何況是學(xué)習(xí)動(dòng)態(tài)規(guī)劃, 跟我一起刷動(dòng)態(tài)規(guī)劃算法題,一起學(xué)會(huì)動(dòng)態(tài)規(guī)劃! 題目鏈接:467. 環(huán)繞字符串中唯一的子字

    2024年02月10日
    瀏覽(24)
  • 動(dòng)態(tài)規(guī)劃--通配字符串匹配

    1. 題目來(lái)源 鏈接:通配符匹配 來(lái)源:LeetCode 2. 題目說(shuō)明 給定一個(gè)字符串 (s) 和一個(gè)字符模式 § ,實(shí)現(xiàn)一個(gè)支持 ‘?’ 和 ‘*’ 的通配符匹配。 ‘?’ 可以匹配任何單個(gè)字符。 ‘*’ 可以匹配任意字符串(包括空字符串)。 兩個(gè)字符串完全匹配才算匹配成功。 說(shuō)明: s 可能為

    2024年02月14日
    瀏覽(36)
  • 【面試經(jīng)典150 | 動(dòng)態(tài)規(guī)劃】交錯(cuò)字符串

    【面試經(jīng)典150 | 動(dòng)態(tài)規(guī)劃】交錯(cuò)字符串

    本專欄專注于分析與講解【面試經(jīng)典150】算法,兩到三天更新一篇文章,歡迎催更…… 專欄內(nèi)容以分析題目為主,并附帶一些對(duì)于本題涉及到的數(shù)據(jù)結(jié)構(gòu)等內(nèi)容進(jìn)行回顧與總結(jié),文章結(jié)構(gòu)大致如下,部分內(nèi)容會(huì)有增刪: Tag:介紹本題牽涉到的知識(shí)點(diǎn)、數(shù)據(jù)結(jié)構(gòu); 題目來(lái)源:

    2024年04月15日
    瀏覽(31)
  • 有效的括號(hào)字符串(力扣)動(dòng)態(tài)規(guī)劃、貪心 JAVA

    有效的括號(hào)字符串(力扣)動(dòng)態(tài)規(guī)劃、貪心 JAVA

    給你一個(gè)只包含三種字符的字符串,支持的字符類型分別是 ‘(’、‘)’ 和 ‘*’。請(qǐng)你檢驗(yàn)這個(gè)字符串是否為有效字符串,如果是有效字符串返回true 。 有效字符串符合如下規(guī)則: 任何左括號(hào) ‘(’ 必須有相應(yīng)的右括號(hào) ‘)’。 任何右括號(hào) ‘)’ 必須有相應(yīng)的左括號(hào) ‘(’

    2024年02月14日
    瀏覽(32)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包