字符串算法小合集

一:互为旋转词

如果一个字符串str,把字符串str前面的任意部分挪到后面去形成的字符串叫做str的旋转词。

比如:1234  旋转词: 2341 3412 4123

给定两个字符串a和b,判断a和b是否互为旋转词。

算法:

1)首先判断长度

2)构建一个新的字符串 a+a  如果b是a+a字符串的子串,那么就互为旋转词。时间复杂度为O(N)

#include<string>
using std::string;
class Rotation
{
public:
    bool chkRotation(string A, string B){
        if (A.size() != B.size())
            return false;                         //如果长度不同,显然不是旋转词
        else{
            string temp = A + A;
            if (temp.find(B) != string::npos)     //如果B是temp(A+A)的子串,那么A和B互为旋转词
                return true;
            else
                return false;                     //否则不是
        }
    }
};
判断旋转词代码实现

 二:单词间做逆序调整

pig loves dog —>dog loves pig

I am a student. —> student. a am I

1.利用容器,把每个单词当作一个元素,逆序排序即可

2.构造一个函数f对string进行逆序,先将整个string逆序,再将局部单词逆序

int main()
{
    Reverse R;
    string str = "dog loves pig";
    cout << str.size() << endl;
    R.f(str, 0, str.size() - 1);                 //将整个字符串逆序
    cout << str << endl;
    int curr= 0;
    for (auto i = 0; i != str.size() - 1; ++i){  //将整个字符串用空格分隔
        if (str[i] == ' '){
            R.f(str, curr, i-1);                 //把每个子串逆序
            curr = i+1;             
        }
    }
    R.f(str, curr, str.size() - 1);              //记得逆序最后一个空格后的单词
    cout << str << endl;
    system("pause");
    return 0;
}

#include<string>
using std::string;
#include<iostream>
using std::cerr;
using std::endl;
class Reverse
{
    typedef string::size_type sz;
public:
    void f(string &A,sz i,sz j){
        if (i > j || j > A.size() - 1 || i < 0){
            cerr << "wrong subscript" << endl;
        }
        else{
            while (i < j){
                std::swap(A[i], A[j]);
                ++i;
                --j;
            }
        }
    }
};
逆序实现代码

 

posted on 2016-12-14 09:35  ToBeAprogrammer  阅读(153)  评论(0)    收藏  举报

导航