力扣:763.劃分字母區間
763.劃分字母區間
問題描述:字串 S 由小寫字母組成。我們要把這個字串劃分為儘可能多的片段,同一字母最多出現在一個片段中。返回一個表示每個字串片段的長度的列表。
同一個字母最多出現在一個片段中
方法一:貪心演算法與雙指標
1.從左到右遍歷字串,遍歷的同時維護當下的字串記錄開始的位置和結束的位置,標記為start和end。初始時候start==end。
2.對於每一個訪問到的字母c,得到當前的字串的初始末尾end,然後繼續遍歷,記錄當前字母出現的最後一個位置end©,當前訪問的字母的結束片段,所以令end=max(end,end©)
3.當訪問到下標end時,當前的片段訪問結束,當前片段的下標是[start,end],長度end-start+1,然後返回end,繼續遍歷下一個片段。
重複上述過程直到遍歷結束。
int *partitionLabels(char *S,int *returnSize){
int last[26];
int length=strlen(S);
for(int i=0;i<length,i++){
last[S[i]-'a']=i; //忘了網友給的解釋了,大概是拿ASSIC碼減了得到下標吧。
}
int *partition=malloc(sizeof(int)*length);
int start=0,end=0;
*returnSize=0;
for(int i=0;i<length;i++){
end=fmax(end,last[S[i]-'a']);
if(i==end){
partition[(*returnSize)++]=end-start+1;
start=end+1
}
}
return partition;
}
時間複雜度
O(n);需要遍歷兩次字串,第一次記錄每個字母出現的下表的位置,第二次遍歷時就行字串的劃分。
空間複雜度
O(26)
相關文章
- 763. 劃分字母區間
- leetcode刷題.763. 劃分字母區間.每日打卡LeetCode
- lc 763.劃分字母區間(字串,雙指標)【***貪心演算法】字串指標演算法
- 程式碼隨想錄演算法訓練營day36 | leetcode 435. 無重疊區間、763. 劃分字母區間、56. 合併區間演算法LeetCode
- 力扣-316. 去除重複字母力扣
- 力扣-435.無重疊區間力扣
- 程式碼隨想錄演算法訓練營第第36天 | 452. 用最少數量的箭引爆氣球、435. 無重疊區間、763.劃分字母區間演算法
- 力扣 leetcode 435. 無重疊區間 貪心力扣LeetCode
- 力扣之僅僅反轉字母(雙指標方式)力扣指標
- 力扣-動態規劃全解力扣動態規劃
- 力扣練習-動態規劃力扣動態規劃
- 力扣455 分發餅乾力扣
- 力扣之二分查詢力扣
- 力扣刷題-二分查詢力扣
- 【力扣198-打家劫舍】動態規劃(python3)力扣動態規劃Python
- 力扣---2020.7.30力扣
- 力扣---2020.9.27力扣
- 力扣---2020.9.29力扣
- 力扣---2020.9.28力扣
- 力扣---2020.9.3力扣
- 力扣---2020.9.4力扣
- 力扣2713 2024.6.19力扣
- 力扣2589 5.16力扣
- 力扣1542 2024.5.22力扣
- 力扣題解力扣
- 力扣(LeetCode)543力扣LeetCode
- 力扣(LeetCode)934力扣LeetCode
- 力扣(LeetCode)103力扣LeetCode
- 力扣(LeetCode)513力扣LeetCode
- 力扣(LeetCode)389力扣LeetCode
- 力扣(LeetCode)796力扣LeetCode
- 力扣(LeetCode)863力扣LeetCode
- 力扣(LeetCode)310力扣LeetCode
- 力扣(LeetCode)130力扣LeetCode
- 力扣(LeetCode)965力扣LeetCode
- 區間動態規劃動態規劃
- 力扣社群開通力扣
- 力扣-9.23-680力扣