Leetcode 每日一题——139. 单词拆分

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)链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值