搜索+枚举字符串子串问题

求字符串的子串问题有两类,一种是不连续,一种是连续。

然而这两种都可以用暴力求解,不过容易 time limited exceed;

那可以只用两个for循环就get全部子串吗?

 

求不连续的子串:用DFS(深度优先搜索)

这里看一个题 HD 1015 Safecracker 

这个题大意就是 在给出的5-12个字符里面找到字典序最大的子串(不连续),子串字符数目是5个,且子串满足公式

v - w^2 + x^3 - y^4 + z^5 = target   (target由输入给出)

这个题要遍历所有的子串,如果一个一个找的话,要用5个for循环,如果更多呢?显然用暴力行不通。

那试试深度优先搜索(其实是递归的思想):

 

 #include 
 #include  
 #include 
 #include 
 #define ma 15
 
 using namespace std; 
 int len,num[30],bj[30];
 char in[ma],ans[ma],t[ma];
 int n;
 
 void work(int k){
 	int sum,i;
 	if(k==5){
    sum=num[t[0]-'A']-pow(num[t[1]-'A'],2)+pow(num[t[2]-'A'],3)-pow(num[t[3]-'A'],4)+pow(num[t[4]-'A'],5);
    if(sum==n&&strcmp(t,ans)>0) strcpy(ans,t);
    return;
    }
    for(i=0;i

这个题是输出一个解,杭电有另一个题要求输出多个解,就要在主函数多加一个for循环。有兴趣可以练练手。

HD 1016 Prime Ring Problem

代码可以参考这个链接  :点击打开链接


求连续的子串:调用函数substr

substr函数在头文件#include里面

要调用substr函数,定义字符串也要用string 定义。

substr函数:

string  s,j;

j=s.substr(i,j);  //从i的位置开始找长度为j的子串,赋给字符串j

杭电有个题可以练练手:HD 1238 Substring

题意大概是给定n个字符串,找到这n个字符串的最长子串(连续),输出最长子串的长度

上代码:

 

#include
#include
#include
#include
#include
#define ma 105

using namespace std;
string a[ma];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        int mi=ma,bj;
        for(int i=0; i>a[i];
            if(a[i].size()0; i--) //子串的长度,从最长的开始找
        {
            for(int j=0; j<=a[bj].size()-i; j++) //用substr找子串的开始位置
            {
                string aa,bb;
                aa=a[bj].substr(j,i);
                bb=aa;
                reverse(bb.begin(),bb.end()); //reverse也是string头文件的函数,把字符串逆置
                int k;
                for(k=0; k

 

 

 

你可能感兴趣的:(OJ题解)