程序员面试金典——1.8反转子串

##1.答案及代码

Solution1:

时间复杂度为 O ( n ) O(n) O(n),方法比较笨。。。

class ReverseEqual {
public:
    bool checkReverseEqual(string s1, string s2) {
        // write code here
        if(s1.compare(s2) == 0) //俩串相等,返回true
            return true;
        if (s1.size() + s2.size() != 0 
            && s1.size() * s2.size() == 0 
            || s1.size() != s2.size())
            return false;
        string temp1, temp2, temp3;
        for(int i = 0; i < s1.size() - 1; i++) { //遍历
            temp1 = s1.substr(0, i + 1);
            temp2 = s1.substr(i + 1);
            temp3 = temp2 + temp1;
            if(temp3.compare(s2) == 0)
                return true;
        }
        return false;
    }
};

Solution2:

参考网址:https://www.nowcoder.com/profile/8343546/codeBookDetail?submissionId=14682830
思路:
以s1=ABCD为例,我们先分析s1进行循环移位之后的结果:
ABCD->BCDA->CDAB->DABC->ABCD …
假设我们把前面移走的数据进行保留:
ABCD->ABCDA->ABCDAB->ABCDABC->ABCDABCD…
因此看出,对s1做循环移位,所得字符串都将是字符串s1s1的子字符串。如果s2可以由s1循环移位得到,则一定可以在s1s1上。
代码:

class ReverseEqual {
public:
    bool checkReverseEqual(string s1, string s2) {
        int size1 = s1.size();
        int size2 = s2.size();
        if(size1 == 0 || size2 == 0){
            return false;
        }//if
        string str = s1 + s1;
        if(str.find(s2) == -1){
            return false;
        }//if
        return true;
    }
};

2. C++中substr()函数和erase()函数的用法

参考网址:[1]https://www.cnblogs.com/xzxl/p/7243490.html
[2]https://www.cnblogs.com/liyazhou/archive/2010/02/07/1665421.html

2.1 C++中substr()函数的用法

#include
#include
using namespace std;
int main()
{
  string s("12345asdf");
  string a = s.substr(0,5);     //获得字符串s中从第0位开始的长度为5的字符串
  cout << a << endl;
}

输出结果为:12345
【更多】
0. 用途:一种构造string的方法

  1. 形式:s.substr(pos, n)
  2. 解释:返回一个string,包含s中从pos开始的n个字符的拷贝(pos的默认值是0,n的默认值是s.size() - pos,即不加参数会默认拷贝整个s)
  3. 补充:若pos的值超过了string的大小,则substr函数会抛出一个out_of_range异常;若pos+n的值超过了string的大小,则substr会调整n的值,只拷贝到string的末尾

2.2 C++中erase()函数的用法

erase函数的原型如下:
(1)string& erase ( size_t pos = 0, size_t n = npos );
(2)iterator erase ( iterator position );
(3)iterator erase ( iterator first, iterator last );
也就是说有三种用法:
(1)erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符
(2)erase(position);删除position处的一个字符(position是个string类型的迭代器)
(3)erase(first,last);删除从first到last之间的字符(first和last都是迭代器)

你可能感兴趣的:(程序员面试金典题目笔记)