c++中string (MFC)
题目:UVALive - 6439 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4450
题意: 输入一个整数 t , 代表程序测试的次数 , 然后要将一些非回文串进行替换形成回文串, 求形成的回文串的最大长度。
例如 abdab -> 非回文串 但是将ab替换成另一个字符* 那么形成 *d* 最长是3,所以最终结果输出3。
做这题之前,先来了解C++中的 string 的用法 。
1.
string 是包含在 头文件<string> 中 记住并非是 cstring 或者是 string.h ,而是另起一个头文件 string
并且需要加上 using namespace std; 的命名空间
2.
string 是c++语言中已经定义的类 ,属于一种类,
所以存在着构造函数和析构函数,
假设
string str; //先声明
string(int n,int c) ; ------>>>> 作用是 对str进行构造函数赋值 复制是n个c是字符串
例如 str.string (3 ,'#'); 那么输出 str 是 ### //三个
还存在 string (const char *p) -----> 拷贝构造赋值
例如: str.string("*****"); 那么输出 str s *****
3.
此处是解题关键,
string l="",r=""; //空内容
l=l+'a'; // l的内容是a
l=l+'b' // l的内容是ab
l=l+'d' // l的内容是abd
以此类推
string s="abc";
s='g'+s; // s的内容是gabc
s='y'+s; // s的内容是ygabc
以此类推 (主要说明 这里加法是 字符串的连接,接前接后看加法的前后)
ac代码:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<stack> #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) #define Swap(a,b,t) t=a,a=b,b=t #define Mem0(x) memset(x,0,sizeof(x)) #define Mem1(x) memset(x,-1,sizeof(x)) #define MemX(x) memset(x,0x3f,sizeof(x)) using namespace std; typedef long long ll; const int inf=0x3f3f3f; const double eps=1e-12; char str[50010]; int main() { int t,cnt=0; cin>>t; while (t--){ cin>>str; int ans=0; string l="",r=""; int len=strlen(str); int mid=len/2; for (int i=len-1;i>=mid;i--){ l=l+str[len-1-i]; r=str[i]+r; if (l==r&&len-1-i!=i){ ans+=2; l.clear(); r.clear(); } if (i==len/2&&!l.empty()) ans++; } printf("Case #%d: %d\n",++cnt,ans); } return 0; }
*******************************************我是分割线***********************************************
链接:https://ac.nowcoder.com/acm/contest/392/J
来源:牛客网
题目描述
月月熟知华华搭讪的规则。华华想与某个小姐姐搭讪,当且仅当小姐姐的昵称是他的昵称的子序列。为了方便,华华和小姐姐的昵称只由小写字母构成。为了更加方便,保证小姐姐的昵称长度不会比华华的长。
现在月月要快速的判断出哪些推荐好友要删掉,因为华华快回来了,时间紧迫,月月有点手忙脚乱,所以你赶紧写个程序帮帮她吧!
输入描述:
第一行输入一个字符串A表示华华的昵称。
第二行输入一个正整数N表示华华的推荐好友的个数。
接下来N行,每行输入一个字符串BiBi表示某个推荐好友的昵称。
输出描述:
输出N行,对于第i个推荐好友,如果华华可能向她搭讪,输出Yes,否则输出No。
注意大写,同时也要注意输出效率对算法效率的影响。
备注:
1≤|A|≤1061≤|A|≤106,1≤N≤1061≤N≤106,1≤∑Ni=1Bi≤106
解法1(百度子序列自动机)
解法2(利用string里的find的函数)
string a;
a.find('a'); //在string类的a中查找第一个 字符a,返回值为该a的地址
a.find('b',pos); // 在string类的a中从位置pos开始查找第一个字符b,同样返回值为该b地址 假若b位置之后不存在元素b,那么返回的是npso值,实际值为-1
解法一(STL中string的直接使用):
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<stack> #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) #define Swap(a,b,t) t=a,a=b,b=t #define Mem0(x) memset(x,0,sizeof(x)) #define Mem1(x) memset(x,-1,sizeof(x)) #define MemX(x) memset(x,0x3f,sizeof(x)) using namespace std; typedef long long ll; const int inf=0x3f3f3f; const double eps=1e-12; string str1,str2; int main() { int t; cin>>str1>>t; int len1=str1.length(); while (t--){ cin>>str2; int len2=str2.length(); bool flag=true; int pos=-1,i=0; while (flag&&pos<len1&&i<len2){ pos=str1.find(str2[i],pos+1); if (pos==str1.npos) //若不存在则返回npso值,实为-1 flag=false; i++; } if (flag) printf("Yes\n"); else printf("No\n"); } return 0; }
解法二(子序列自动机):
子序列自动机详解:
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<queue> #include<stack> #include<algorithm> #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) #define Mem0(x) memset(x,0,sizeof(x)) #define Mem1(x) memset(x,-1,sizeof(x)) #define MemX(x) memset(x,0x3f,sizeof(x)) using namespace std; typedef long long ll; const int inf=0x3f3f3f; const int MAX=1e6+10; char str1[MAX],str2[MAX]; int dfs[MAX][30],res[30]; int main() { int n; cin>>str1+1>>n; int len=strlen(str1+1); for (int i=0;i<26;i++) res[i]=-1; for (int i=len;i>=0;i--){ for (int j=0;j<26;j++){ dfs[i][j]=res[j]; } res[str1[i]-'a']=i; } while (n--){ cin>>str2+1; int len1=strlen(str2+1); bool flag=true; int tmp=0; for (int i=1;i<=len1;i++){ if (dfs[tmp][str2[i]-'a']==-1){ flag=false; break; } tmp=dfs[tmp][str2[i]-'a']; } if (flag) printf("Yes\n"); else printf("No\n"); } return 0; }
对于string类的输入问题
1.假若输入的字符串中不存在空格, 那么可以直接 用cin,
string a; cin>>a; int len=a.length(); cout<<"len="<<len<<endl;
不难发现这里和char型的输入是相同的。
2.那假若你输入的字符串中存在空格呢? 哪要怎么输入才能对?
我们都知道gets函数,但是在语法上string不能用gets,否则会报错。
解决法案: (使用getline函数)
string a; getline(cin,a); int len=a.length(); cout<<"len="<<len<<endl;
其实getline是存在三个参数的函数。
getline(参数1,参数2,参数3)
参数1 ----> 输入 std::cin
参数2 ----> string变量名
参数3 ----> 结束字符 例子如下:(参数3可缺省)
string a; getline(cin,a,'a'); int len=a.length(); cout<<"len="<<len<<endl;
截取字符串操作
假设你现在要执行的操作是截取string部分字符串,通过暴力截取的方法不如使用下列库函数。
1.str1.substr(a,b); 其中a,b都为整数, 这里的意思是截取地址a后的b个元素。(实例如下:)
int main() { string str,str1; cin>>str1; cout<<str1<<endl; str=str1.substr(1,3); cout<<str<<endl; return 0; }
![](https://img2018.cnblogs.com/blog/1348207/201904/1348207-20190402170209458-895754701.png)
2.str1.replace(); 替代函数
https://blog.csdn.net/jiary5201314/article/details/52502516/
3.String string = Integer.toBinaryString(n); (JAVA中让十进制整数n转换为32位的2进制)
char[] chars = string.toCharArray(); (JAVA中string转字符型)