您的位置:首页 > 职场人生

程序员编程艺术:第二章、字符串是否包含问题

2013-11-28 00:10 489 查看
题目描述:http://blog.csdn.net/v_JULY_v/article/details/6347454

假设这有一个各种字母组成的字符串A,和另外一个字符串B,字符串里B的字母数相对少一些。什么方法能最快的查出所有小字符串B里的字母在大字符串A里都有?

比如,如果是下面两个字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPO
答案是true,所有在string2里的字母string1也都有。

如果是下面两个字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPZ
答案是false,因为第二个字符串里的Z字母不在第一个字符串里。

点评:
1、题目描述虽长,但题意简单明了,就是给定一长一短的俩个字符串A,B,假设A长B短,现在,要你判断B是否包含在字符串A中,即B?(-A。

2、题意虽简单,但实现起来并不轻松,且当如果面试官步步紧逼,一个一个否决你能想到的方法,要你给出更好、最好的方案时,你恐怕就要伤不少脑筋了。

ok,在继续往下阅读之前,您最好先想个几分钟,看你能想到的最好方案是什么,是否与本文最后实现的方法一致。

第一节、基本思路解题

[b]1.1、O(n*m)的轮询方法[/b]

#include<iostream>
#include <string>
using namespace std;
int comparestring(string &a,string&b)//此处假设a为长字符,b为段字符
{
int i,j;
int len_a=a.length();
int len_b=b.length();
for (i=0;i<len_b;i++)
{
for(j=0;j<len_a;j++)
{
if (a[j]==b[i])
break;
}
if(j==len_a)
return 0;//0表示没找到
}
return 1;//表示能匹配
}
int main()
{
string a="lisongfeng9213";
string b="ldsf921";
cout<<comparestring(a,b)<<endl;
}


1.2、O(mlogm)+O(nlogn)+O(m+n)的排序(快排)方法

#include<iostream>
#include <string>
#include <algorithm>
using namespace std;

int Partition(string &a,int low,int high) //以最后一个元素,data[hi]为主元
{
int i=0;
int j;
int key=a[high];
for (j=0;j<high;j++)
{
if (a[j]<=key)
{
swap(a[i],a[j]);
i++;
}
}
swap(a[i],a[high]);
return i;
}
void quicksort(string &a,int low,int high)
{
if (low<high)
{
int k=Partition(a,low,high);
quicksort(a,low,k-1);
quicksort(a,k+1,high);
}

}

void comparestring(string &a,string &b)//依旧是a长,b短。
{
int pos_a=0;
int pos_b=0;
while(pos_a < a.length() && pos_b < b.length())
{
if (a[pos_a]==b[pos_b])
{
pos_a++;
pos_b++;
}
else
pos_a++;
}
if (pos_b==b.length())
{
cout<<"找到啦"<<endl;
}
else
cout<<"没找到"<<endl;
}

int main()
{
string a="lisongfeng9213";
string b="lsf921";
quicksort(a,0,a.length()-1);
quicksort(b,0,b.length()-1);
comparestring(a,b);
}


1.3、O(n+m)的计数排序(countersort)方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐