leetcode刷题字符串

字符串

leetcode151:反转字符串中的单词

class Solution{
    public:
        void removeExtraSpaces(string& s)
        {
            int slow = 0;//定义一个慢指针负责控制单词的左边界;
            for(int i = 0; i < s.size(); i++)//i负责寻找单词并拷贝给slow;
            {
                if(s[i] != ' ')//当寻找到单词时进行操作;
                {
                    if(slow != 0)//首先判断slow是否位于开头,
                        s[slow++] = ' ';//如果不是位于开头先加一个空格,在后移等待字母拷贝;
                    while(i <s.size() && s[i] != ' ')//字母拷贝过程,只要没遇到空格且没走到
                        s[slow++] = s[i++];//字符串结尾,则一直进行拷贝;
                }
            }
            s.resize(slow);//比较巧妙的是slow恰好可以反映新的s的大小;
        }

        void reverse(string& s, int start, int end)
        {
            for(int i = start, j = end; i < j; i++, j--)
                swap(s[i], s[j]);//这是左闭右闭的区间翻转;
        }

        string reverseWords(string s)
        {
            removeExtraSpaces(s);//先移除多余的空格;
            reverse(s, 0, s.size() - 1);//再将字符串整体翻转;
            int start = 0;
            for(int i = 0; i <= s.size(); i++)//再翻转里面的每个单词;
            {
                if(s[i] == ' ' || i = s.size())//碰到空格或者字符串末尾都是单词结束的标志;
                    reverse(s, start, i - 1); //注意此处是 i - 1,因为翻转用的左闭右闭;
            }
            return s;
        }
};

leetcode28:KMP

class Solution{
    public:
            void getNext(int next[], string s)
            {
                int j = 0;//初始化j和next数组;
                next[0] = 0;
                for(int i = 1; i < s.size(); i++)
                {
                    while(j > 0 && s[i] != s[j])//如果不相等,则j要回退,回退回前一个表示的值;
                        j = next[j - 1];//因为是连续回退,所以要用while;
                    if(s[i] == s[j])//如果相等,则说明最大公共前后缀可以增加;
                        j++;//后面的最大公共前后缀可以用到前面的,所以j++;
                    next[i] = j;//i处的最大公共前后缀可以固定下来;
                }
            }

            int strStr(string haystack, string needle)
            {
                int next[needle.size()];
                getNext(next, needle);
                for(int i = 0, j = 0; i < haystack.size(); i++)
                {
                    while(j > 0 && haystack[i] != needle[j])
                        j = next[j - 1];
                    if(haystack[i] == needle[j] && j < needle.size())
                        j++;
                    if(j == needle.size())
                        return i - j + 1;
                }
                return -1;
            }

};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值