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

每日微软面试题——day 6(打印所有对称子串)

2011-08-14 14:27 651 查看
<以下微软面试题全来自网络>

<以下答案与分析纯属个人观点,不足之处,还望不吝指出^_^>

<出处:http://blog.csdn.net/zhanxinhang>

:1、如何判断一个字符串是对称的?如a,aa,aba。

2、如何利用2函数找出一个字符串中的所有对称子串?

分析:

看第一个问题判断字符串对称,有以下两种方法。


方法一
、使迭代器p1指向头,p2指向尾。使p1,p2相对而行(—> | <[b]—)[/b],每次比较p1,p2是否相等,直到它们相遇。

方法二、使p1、p2指向中间的一个元素(如果字符串长度为偶数的话就指向中间两个相邻的元素),使它们相向而行(<[b]— |[b]—>[/b])[/b],每次比较p1,p2是否相等。直到它们一个指向头一个指向尾便结束。


(可以看出方法1明显好于方法2)


在看第二个问题打印所有的对称子串,判断对称子串的问题我们似乎已经解决,且有以上两种方法,针对现在的情况是否两种都合适呢,确切的说不是。如果是方法一,请想象一下,如果要p1,p2一个指向子串的头一个指向子串的尾,那么至少要两层循环一层控制p1一层控制p2,还有一层循环用于判断子串是否对称,也就是说总共需要三层嵌套循环,时间复杂度指数为3。而如果选择方法二呢?
两层循环就能实现,不过要适应现在这种情况需要做些修改,就是针对偶数长度的子串进行一次遍历,再针对奇数长度的子串进行一次遍历,也就是两层嵌套循环中内层有两次循环,时间复杂度指数为2。详情且看代码。

实现加测试代码:

/**
Author:花心龟
Blog:http://blog.csdn.net/zhanxinhang
**/

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
class App
{
typedef string::iterator Iter_t;

string m_str;
void print(Iter_t p1, Iter_t p2) //打印从p1开始到p2结束的字符
{
while(p1<=p2)
{
cout<<*p1;
p1++;
}
cout<<" | ";
}
bool isHuiwen1(Iter_t start,Iter_t end) //法1判断是否为对称子串
{
Iter_t p1 = start;
Iter_t p2 = end;
int times = (distance(p1,p2)+1) / 2; //比较次数
while(times)
{
if(*p1 != *p2)
return false;

p1++;
p2--;
times--;
}
return true;
}

bool isHuiwen2(Iter_t mid_it) //法2判断是否为对称子串
{
Iter_t p1,p2;
p1 = p2 = mid_it;

while(p1>=m_str.begin() && p2 < m_str.end())
{
if(*p1 != *p2)
break;
print(p1,p2);//打印从p1到p2的字符
p1--,p2++;
}

p1 = p2 = mid_it;
p2++; //使p2向前移动一个位置,此时p1,p2分别指向中间两个相邻位置
while(p1>=m_str.begin() && p2 < m_str.end())
{
if(*p1 != *p2)
return false;
print(p1,p2);//打印从p1到p2的字符
p1--,p2++;
}
return true;
}

void show_all_substr_of_huiwen1() //法一打印所有对称子串
{
Iter_t p2=m_str.end()-1;
Iter_t p1 = m_str.begin();
for(;p1!=m_str.end();p1++)
for(p2=p1;p2!=m_str.end();p2++)
{
if(isHuiwen1(p1,p2))
print(p1,p2);
}
}

void show_all_substr_of_huiwen2()  //法二打印所有对称子串
{
Iter_t it = m_str.begin();

for(;it!=m_str.end();it++)
{
isHuiwen2(it);
}
}

public:

void run()
{
m_str="abaaba";
cout<<"测试数据为:abaaba"<<endl;
show_all_substr_of_huiwen1();
cout<<endl;
show_all_substr_of_huiwen2();
cout<<endl;

m_str="asdfie";
cout<<"测试数据为:asdfie"<<endl;
show_all_substr_of_huiwen1();
cout<<endl;
show_all_substr_of_huiwen2();
cout<<endl;

m_str="aabaa";
cout<<"测试数据为:aabaa"<<endl;
show_all_substr_of_huiwen1();
cout<<endl;
show_all_substr_of_huiwen2();
cout<<endl;

//时间比较//
m_str="this is a string for testing. aabaa alskjdfkljasdjflasdflkajsldkjfsjlakjsdlfjwoekjlakjlsdkjflsajlkdjfowieuoriuq aaddbb sldjfalkjsdlfkjasldjflajsldfjalskdjflakjsdlfkjaslkdjflajsdlfkjaslkdjflkajsdlkjflkasjdlfjaklsjdkfljaklsdjfklsajdflkjslkdjflaskjdlfkjalsdjlfkajsldfkjlaksjdfljasldjflaskjdfkasjdflaksjdkfljaskldfjlaksjdfljasldjflaksjdkljfkalsjdlkfjasldjflasjdlfjasldjfklsajdfljaskldfjlsakjdflkasjdfkl this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.make -k make -k make -k make -k make -k make -k is is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.make -k make -k make -k make -k make -k make -k is is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.make -k make -k make -k make -k make -k make -k is is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.make -k make -k make -k make -k make -k make -k is is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.make -k make -k make -k make -k make -k make -k is is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.make -k make -k make -k make -k make -k make -k is is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.make -k make -k make -k make -k make -k make -k is is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.make -k make -k make -k make -k make -k make -k is is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.make -k make -k make -k make -k make -k make -k is is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.make -k make -k make -k make -k make -k make -k is is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.make -k make -k make -k make -k make -k make -k is is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.this is a string for testing.make -k make -k make -k make -k make -k make -k end";

time_t start,record1;

cout<<"show all substr of huiwen 1:";
system("pause");
start = time(NULL);
show_all_substr_of_huiwen1();
record1 = time(NULL);

cout<<endl;
cout<<"time:"<<record1-start;
cout<<endl;

cout<<"show all substr of huiwen 2:";
system("pause");
start = time(NULL);
show_all_substr_of_huiwen2();
record1 = time(NULL);

cout<<endl;
cout<<"time:"<<record1-start;
cout<<endl;

cout<<"(可以看到打印速度明显快于上一次)";
}
};

int main()
{
App myapp;
myapp.run();

system("pause");
return 0;
}


测试结果:



各测试数据下的一二行为打印出来的所有对称字串。

按下任意键后:



以上是使用方法1打印出来的结果。

按下任意键后:



以上便是用方法2打印出来的结果。

上一篇:每日微软面试题——day
5
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: