139. 单词拆分
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。
这道题目拿到手上,确实没什么思路,我开始想的是使用集合储存字符然后查找,最后发现没办法实现,只好参考了答案,答案也是用的hash表,但是官方答案的hash表中存储的是字符最后一次出现的索引,然后使用双指针贪心地查找所需区间。具体C++的实现如下:
class Solution {
public:
vector<int> partitionLabels(string S) {
vector<int> result;
if(!S.length()) return result;
vector<int> chMap(26,0);
for(int i=0;i<S.length();i++)
{
chMap[S[i]-'a']=i;
}
int start=0;
int end=0;
for(int i=0;i<S.length();i++)
{
int tmpend=chMap[S[i]-'a'];
end=max(end,tmpend);
if(i==end)
{
result.push_back(end-start+1);
start=end+1;
}
}
return result;
}
};
运行效果:
相同思路Python 的实现如下:
class Solution:
def partitionLabels(self, S: str) -> List[int]:
chMap=[0]*26
result=list()
for i in range(len(S)):
chMap[ord(S[i])-ord('a')]=i
start,end=0,0
for i in range(len(S)):
end=max(end,chMap[ord(S[i])-ord('a')])
if(end==i):
result.append(end-start+1)
start=end+1
return result
运行效果:
来源:力扣(LeetCode)链接