600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 字符串截取函数substr()的用法

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

时间:2024-03-24 20:01:24

相关推荐

字符串截取函数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<map>#include<set>#include<stack>#include<queue>#include<cmath>#include<bitset>#include<cstdio>#include<string>#include<vector>#include<sstream>#include<cstring>#include<stdlib.h>#include<iostream>#include<algorithm>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;}/*5attouchcheatchoosetacta*/

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。