程序员编程艺术:第二章、字符串是否包含问题
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]
1.2、O(mlogm)+O(nlogn)+O(m+n)的排序(快排)方法
1.3、O(n+m)的计数排序(countersort)方法
假设这有一个各种字母组成的字符串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)方法
相关文章推荐
- 个人解法 ------- 程序员编程艺术:第二章、字符串是否包含问题
- 程序员编程艺术:第二章、字符串是否包含及匹配/查找/转换/拷贝问题
- 【程序员编程艺术】第二章:字符串是否包含问题
- 程序员编程艺术:第二章、字符串是否包含及匹配/查找/转换/拷贝问题
- 程序员编程艺术:第二章、字符串是否包含问题
- 程序员编程艺术:第二章、字符串是否包含问题
- 程序员编程艺术:第二章、字符串是否包含及匹配/查找/转换/拷贝问题
- 程序员编程艺术:第二章、字符串是否包含问题
- 程序员编程艺术:第二章、字符串是否包含及匹配/查找/转换/拷贝问题
- 程序员编程艺术:第二章、字符串是否包含问题
- 程序员编程艺术:第二章、字符串是否包含及匹配/查找/转换/拷贝问题
- 程序员编程艺术:第二章、字符串是否包含及匹配/查找/转换/拷贝问题
- 程序员编程艺术:第二章、字符串是否包含问题
- 程序员编程艺术:第二章、字符串是否包含问题
- 程序员编程艺术:第二章、字符串是否包含及匹配/查找/转换/拷贝问题
- [整理]程序员编程艺术:第二章、字符串是否包含问题
- 程序员编程艺术2:字符串是否包含问题
- 程序员编程艺术学习笔记(二)字符串是否包含问题
- 读程序员编程艺术第二章---字符串包含问题
- 读程序员编程艺术第二章---字符串包含问题(二)