手機(jī)微網(wǎng)站怎么做的開封網(wǎng)絡(luò)推廣哪家好
- 博客主頁:誓則盟約
- 系列專欄:IT競賽 專欄
- 關(guān)注博主,后期持續(xù)更新系列文章
- 如果有錯(cuò)誤感謝請大家批評指出,及時(shí)修改
- 感謝大家點(diǎn)贊👍收藏?評論??
1910.刪除一個(gè)字符串中所有出現(xiàn)的給定子字符串【中等】
題目:
給你兩個(gè)字符串?s
?和?part
?,請你對?s
?反復(fù)執(zhí)行以下操作直到?所有?子字符串?part
?都被刪除:
- 找到?
s
?中?最左邊?的子字符串?part
?,并將它從?s
?中刪除。
請你返回從?s
?中刪除所有?part
?子字符串以后得到的剩余字符串。
一個(gè)?子字符串?是一個(gè)字符串中連續(xù)的字符序列。
示例 1:
輸入:s = "daabcbaabcbc", part = "abc" 輸出:"dab" 解釋:以下操作按順序執(zhí)行: - s = "daabcbaabcbc" ,刪除下標(biāo)從 2 開始的 "abc" ,得到 s = "dabaabcbc" 。 - s = "dabaabcbc" ,刪除下標(biāo)從 4 開始的 "abc" ,得到 s = "dababc" 。 - s = "dababc" ,刪除下標(biāo)從 3 開始的 "abc" ,得到 s = "dab" 。 此時(shí) s 中不再含有子字符串 "abc" 。
示例 2:
輸入:s = "axxxxyyyyb", part = "xy" 輸出:"ab" 解釋:以下操作按順序執(zhí)行: - s = "axxxxyyyyb" ,刪除下標(biāo)從 4 開始的 "xy" ,得到 s = "axxxyyyb" 。 - s = "axxxyyyb" ,刪除下標(biāo)從 3 開始的 "xy" ,得到 s = "axxyyb" 。 - s = "axxyyb" ,刪除下標(biāo)從 2 開始的 "xy" ,得到 s = "axyb" 。 - s = "axyb" ,刪除下標(biāo)從 1 開始的 "xy" ,得到 s = "ab" 。 此時(shí) s 中不再含有子字符串 "xy" 。
提示:
1 <= s.length <= 1000
1 <= part.length <= 1000
s
?????? 和?part
?只包小寫英文字母。
分析問題:
思路1:
????????題目很有意思哈,從左往右遍歷,找到給定的part則刪除part然后重新遍歷,有趣。那么這里我們用for循環(huán)肯定是不行的,我們不知道什么時(shí)間截止,所以考慮用while循環(huán),那么我們Python可以借助一個(gè)有趣的函數(shù)來幫助我們找part,就是split函數(shù)。
????????split函數(shù),可以傳入兩個(gè)常用的參數(shù),參數(shù)1:分隔標(biāo)志。就是元素見了這個(gè)標(biāo)志就把左右分成兩部分,這里的這個(gè)標(biāo)志我們就可以設(shè)置為part,遇見part就分隔,如此part就會(huì)被自動(dòng)刪除。那么第二個(gè)參數(shù)是分隔次數(shù)。沒錯(cuò),正好可以滿足我們的需求,我們每次刪除一次都需要重新遍歷一次,那么我們就可以設(shè)置這個(gè)次數(shù)為1,意思就是只分隔一次。
????????那么我們每次分隔遍歷都會(huì)刷新一下s,while循環(huán)的進(jìn)入條件就可以設(shè)置為 while part in s: 只要還存在part在s里,那么就繼續(xù)循環(huán)。直到最后返回s。
思路2:
????????除了split函數(shù)有這個(gè)功能外,其實(shí)還有一個(gè)不常用但是常見的函數(shù)也可以達(dá)到這種目的,這個(gè)函數(shù)就是 replace函數(shù)。
????????replace函數(shù)可以接受三個(gè)參數(shù),分別為 要被替換的值 和 要替換成的值 以及 替換次數(shù)。這里我們就可以設(shè)置被替換掉的值為part,那么把它給替換成空字符串"",然后 替換次數(shù)還是設(shè)置為1次,替換一次我們就重新循環(huán)一次。也是用while循環(huán)并且進(jìn)入循環(huán)和退出循環(huán)的條件與上方一樣。
代碼實(shí)現(xiàn):
思路1代碼實(shí)現(xiàn):
class Solution:def removeOccurrences(self, s: str, part: str) -> str:while part in s:v=s.split(part,1)s=''for i in v:s+=ireturn s
思路2代碼實(shí)現(xiàn):
class Solution:def removeOccurrences(self, s: str, part: str) -> str:while part in s:s = s.replace(part,'',1)return s
?兩者復(fù)雜度其實(shí)差不多,但是思路二有點(diǎn)以空間換時(shí)間的意思了哈。
總結(jié):
共同點(diǎn):
- 目標(biāo)相同:兩段代碼的目的都是從給定的字符串?
s
?中移除所有出現(xiàn)的特定子字符串?part
?。
考點(diǎn):
- 字符串操作:包括字符串的查找、分割、替換和拼接等操作。
- 循環(huán)控制:使用?
while
?循環(huán)來持續(xù)處理,直到滿足特定條件。
思路:
- 都是通過不斷檢查子字符串?
part
?在?s
?中的存在情況來進(jìn)行處理。- 第一段代碼:通過?
split
?分割字符串,然后重新拼接來實(shí)現(xiàn)移除。 - 第二段代碼:直接使用?
replace
?方法替換子字符串,每次只替換一次。
- 第一段代碼:通過?
- 循環(huán)的條件都是只要子字符串?
part
?還存在于字符串?s
?中,就繼續(xù)處理。
????????這道題很考驗(yàn)對字符串切割和循環(huán)的熟練程度,是練習(xí)字符串類型的好題!這里也可以考慮使用數(shù)據(jù)結(jié)構(gòu) 棧 來解題。棧 也可以找到目標(biāo)字符串并實(shí)現(xiàn)刪除的一個(gè)功能,感興趣的可以嘗試。?