每日算法题三道之字符串循环移动以及词语的翻转

题目:
2、给定一个字符串S[0…..N-1],要求把S的前k个字符移动到S的尾部,如把字符串”abcdef”前面的2个字符’a’,‘b’移动到字符串的尾部,得到新字符串”cdefab”:即字符串循环左移k。要求时间复杂度为O(N),空间复杂度为O(1)。
1)思路一:逐个字符左移,将bcdef依次左移1个,再将a移到末尾;b是同样的操作,这样最坏时间复杂度为O(N2)。
2)思路二:先将ab,cdef分别保存,再将ab拼接到cdef末尾,空间复杂度为O(N)。
3)思路三:
三次翻转: 令”ab” = X,”cdef” = Y;
①X翻转 -> X的逆序X’
②Y翻转 -> Y的逆序Y’
③X’Y’翻转 -> YX
类似的题目
I LOVE U –> U LOVE I
I翻转,LOVE翻转,U翻转 ,最后整个翻转
代码:

/************************************
功能:翻转一句话中的词语,eg: i love u -> u love i
@athor:rly
@date: 2018-3-8
*************************************/

#include <string>
#include <iostream>

using namespace std;

void swap(char &c1, char &c2)
{
    char tmp = c1;
    c1 = c2;
    c2 = tmp;
}

void reverseStr(string &str, int start, int end)
{
    while (start < end)
    {
        swap(str[start], str[end]);
        start++;
        end--;
    }
}

string rotateStrofWord(const string srcStr)
{
    if (srcStr.size() <= 0)
    {
        return "";
    }
    string SrcStr = srcStr;
    int start = 0;
    int end = 0;              //记录字符串中word在字符串中的起始位置和终止位置

    for (start = 0; start < SrcStr.size();)
    {
        for (end = start; end < SrcStr.size();end++)
        {
            if (SrcStr[end] == ' ')
            {
                break;
            }
        }                                          //当遇到空格时,说明已找到一个完整的词
        if ((end - start) > 1)                        
        {
            reverseStr(SrcStr, start, end - 1);
        }                                          //当这个词个数大于1时才翻转
        if (end == SrcStr.size())
        {
            break;
        }                                         //若找到了尾部,则结束
        while (SrcStr[end] == ' ')
        {
            end++;
        }                                       //继续找下一个词
        start = end;
    }
    reverseStr(SrcStr, 0, SrcStr.size() - 1);   //最后整句翻转
    return SrcStr;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值