字符串截取函数substr()的用法

substr()的用法

substr函数是用于字符串的截取的函数,只适用于string类型,并不适用于字符数组。

string s;
s.substr(i,len);
//从s的i位开始截取长度为len的串

当len的长度大于串的长度或者省略参数len时,会默认返回到字符串的结尾,当传参出现负数的时候会RE

1022.成语接龙

题目描述:

这个题意很坑,题意描述的很不清楚,差评

已知n个单词,给出龙头字母,要求以这个字母开头的最长的“龙”(每个单词最多在“龙”中出现2次),在两个单词相连时,起重合的部分合为一部分,例如best和stabber,接成一条龙则变为bestabber,另外相邻的两部分不能存在包含关系,例如at 和 atside 间不能相连。

思路:

首先,这个题坑点在于:“两个单词相连时,重合部分合为一个部分”,也就是说你应该用的是上次连接成功的那个单词来和字符串去匹配,而不是拿前面连接好的龙来匹配!而且一个串不能是另一个串的子串

思路就比较明显了,是dfs,对于每个开头是龙头的字符串是跑dfs,dfs传俩参数,一个是上一次连接成功的单词,第二个是龙的长度,然后就暴力匹配每个字符串, 看看能不能找到能连接的,然后就乱搞搞

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;

#define eps 1e-8
#define endl '\n'
#define inf 0x3f3f3f3f
#define MAX  1048576
#define mod 1000000007
#define lowbit(x) (x & (-x))
#define sd(n) scanf("%d",&n)
#define sdd(n,m) scanf("%d %d",&n,&m)
#define pd(n) printf("%d\n", (n))
#define pdd(n,m) printf("%d %d\n",n, m)
#define sddd(n,m,z) scanf("%d %d %d",&n,&m,&z)
#define io ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define mem(a,b) memset((a),(b),sizeof(a))
//#define max(a,b) (((a)>(b)) ? (a):(b))
//#define min(a,b) (((a)>(b)) ? (b):(a))

typedef  long long ll ;
typedef unsigned long long ull;
//不开longlong见祖宗!不看范围见祖宗!
inline int IntRead(){char ch = getchar();int s = 0, w = 1;while(ch < '0' || ch > '9'){if(ch == '-') w = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){s = s * 10 + ch - '0';ch = getchar();}return s * w;}

int n;
string str[30];
char x;
int ans;
int tr[30];

void dfs(string s, int num){
    ans = max(ans, num);//更新答案
    for(int i = 1; i <= n; ++i){
        if(tr[i] == 2)continue;
        int len1 = (int)s.size();
        int len2 = (int)str[i].size();
        for(int j = min(len1, len2) - 1; j >= 1; --j){
            if(s.substr(len1 - j, j) == str[i].substr(0, j)){//用上一个连接成功的字符串的后缀去匹配别的字符串的前缀
                ++tr[i];//记录次数用
                dfs(str[i], num + len2 - j);
                --tr[i];
            }
        }
    }
}

int main(){
    cin>>n;
    for(int i = 1; i <= n; ++i)cin>>str[i];
    cin>>x;
    for(int i = 1; i <= n; ++i){
        if(str[i][0] == x){
            mem(tr, 0);
            ++tr[i];
            dfs(str[i], (int)str[i].size());
        }
    }
    cout<<ans<<endl;
    return 0;
}
/*
 5
 at
 touch
 cheat
 choose
 tact
 a
 */

你可能感兴趣的:(c语言,算法,字符串函数,substr)