1.2字符串包含

来源:互联网 发布:美容美发管理软件源码 编辑:程序博客网 时间:2024/06/18 02:37

判断字符串A中是否包含字符串B。

  方法一:两遍for循环暴力破解。也是我天梯PAT里L1超时的算法。很渣。

  方法二:建立哈希映射,开int s[200]数组 将对应的 A[i]存入S[A[i]]中 置1 。之后遍历B数组。判断S[B[i]]是否为1。若为1则是A组中字符,若为0则break跳出。

  下面给出书中 时间复杂度为O(m+n) 空间复杂度为O(1)的算法。超棒。然而位运算挺难懂。

用hashs int整型数来给每个字符标号。具体代码如下

  #include <iostream>
#include <string>
using namespace std;
int hashs=0;
bool StringContain(string &a,string &b)
{
    for(int i=0;i<a.length();++i)
        hashs|=(1<<(a[i]-'A'));   //与‘A'的差值寻找它对应的二进制。 再用hashs  或 上结果  (二进制中运算)
    for(int i=0;i<b.length();++i)
    {
        if((hashs&(1<<(b[i]-'A')))==0)  //判断hashs 与 上B中差值的结果。若为0则此时符号无标记跳出。
            return false;
    }
    return true;
}
int main()
{
    string a,b;
    cin>>a>>b;
    int c;
    c=StringContain(a,b);
    cout<<c<<endl<<hashs;
    return 0;
}

个人认为方法二挺好的。空间量完全可以接受。毕竟只是在ASCII码表中。而且简单易懂,不容易出错

0 0
原创粉丝点击