题目: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-;
char str[];
int main()
{
int t,cnt=;
cin>>t;
while (t--){
cin>>str;
int ans=;
string l="",r="";
int len=strlen(str);
int mid=len/;
for (int i=len-;i>=mid;i--){
l=l+str[len--i];
r=str[i]+r;
if (l==r&&len--i!=i){
ans+=;
l.clear();
r.clear();
}
if (i==len/&&!l.empty())
ans++;
}
printf("Case #%d: %d\n",++cnt,ans);
}
return ;
}

*******************************************我是分割线***********************************************

链接:https://ac.nowcoder.com/acm/contest/392/J
来源:牛客网

题目描述

月月和华华一起去吃饭了。期间华华有事出去了一会儿,没有带手机。月月出于人类最单纯的好奇心,打开了华华的手机。哇,她看到了一片的QQ推荐好友,似乎华华还没有浏览过。月月顿时醋意大发,出于对好朋友的关心,为了避免华华浪费太多时间和其他网友聊天,她要删掉一些推荐好友。但是为了不让华华发现,产生猜疑,破坏了他们的友情,月月决定只删华华有可能搭讪的推荐好友。
月月熟知华华搭讪的规则。华华想与某个小姐姐搭讪,当且仅当小姐姐的昵称是他的昵称的子序列。为了方便,华华和小姐姐的昵称只由小写字母构成。为了更加方便,保证小姐姐的昵称长度不会比华华的长。
现在月月要快速的判断出哪些推荐好友要删掉,因为华华快回来了,时间紧迫,月月有点手忙脚乱,所以你赶紧写个程序帮帮她吧!

输入描述:

第一行输入一个字符串A表示华华的昵称。
第二行输入一个正整数N表示华华的推荐好友的个数。
接下来N行,每行输入一个字符串BiBi表示某个推荐好友的昵称。

输出描述:

输出N行,对于第i个推荐好友,如果华华可能向她搭讪,输出Yes,否则输出No。
注意大写,同时也要注意输出效率对算法效率的影响。
示例1

输入

复制

noiauwfaurainairtqltqlmomomo
8
rain
air
tql
ntt
xiaobai
oiiiooo
orzcnzcnznb
ooooo

输出

复制

Yes
Yes
Yes
Yes
No
Yes
No
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-;
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=-,i=;
while (flag&&pos<len1&&i<len2){
pos=str1.find(str2[i],pos+);
if (pos==str1.npos) //若不存在则返回npso值,实为-1
flag=false;
i++;
}
if (flag)
printf("Yes\n");
else
printf("No\n");
}
return ;
}

解法二(子序列自动机):


子序列自动机详解:
#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+;
char str1[MAX],str2[MAX];
int dfs[MAX][],res[];
int main()
{
int n;
cin>>str1+>>n;
int len=strlen(str1+);
for (int i=;i<;i++)
res[i]=-;
for (int i=len;i>=;i--){
for (int j=;j<;j++){
dfs[i][j]=res[j];
}
res[str1[i]-'a']=i;
}
while (n--){
cin>>str2+;
int len1=strlen(str2+);
bool flag=true;
int tmp=;
for (int i=;i<=len1;i++){
if (dfs[tmp][str2[i]-'a']==-){
flag=false;
break;
}
tmp=dfs[tmp][str2[i]-'a'];
}
if (flag)
printf("Yes\n");
else
printf("No\n");
}
return ;
}
对于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(,);
cout<<str<<endl;
return ;
}



2.str1.replace();  替代函数

https://blog.csdn.net/jiary5201314/article/details/52502516/

c++中string (MFC)的更多相关文章

  1. 标准C++中string类的用法

    转自博客园:http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html 相信使用过MFC编程的朋友对CString这个类的印象应该非 ...

  2. C++中string跨DLL失败解决途径

    1.问题描述: 在一个MFC应用程序exe中,调用另一个DLL中的函数,函数中的一个形参是string类型的,每次调用都会出现乱码的情况. 调用前: 调用后: 2.原因分析: 不同的模块各自有一份C运 ...

  3. 标准C++中string类的用法总结

    相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯 ...

  4. C++中string类的操作函数。

    相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯 ...

  5. BCL中String.Join的实现

    在开发中,有时候会遇到需要把一个List对象中的某个字段用一个分隔符拼成一个字符串的情况.比如在SQL语句的in条件中,我们通常需要把List<int>这样的对象转换为“1,2,3”这样的 ...

  6. C#中string.format用法详解

    C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...

  7. java中string内存的相关知识点

    (一):区别java内存中堆和栈: 1.栈:数据可以共享,存放基本数据类型和对象的引用,其中对象存放在堆中,对象的引用存放在栈中: 当在一段代码块定义一个变量时,就在栈中 为这个变量分配内存空间,当该 ...

  8. java中String的相等比较

    首先贴出测试用例: package test; import org.junit.Test; /** * Created by Administrator on 2015/9/16. * */ pub ...

  9. java中String、StringBuffer、StringBuilder的区别

    java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...

随机推荐

  1. 在Windows 10上部署Apache PredictionIO开发环境

    Windows在初研究人员的探索下,研究出了一套更为精简的环境配置,极大的缩短了开发时间与效率,在此总结以供后来者参阅. 1.部署环境的配置 Windows10 64 home IntelliJ ID ...

  2. shared_ptr 的使用及注意事项

    1. 声明#include <boost/shared_ptr.hpp> class UsersBitmap { ... } typedef boost::shared_ptr<Us ...

  3. [原]如何在Android用FFmpeg+SDL2.0之同步视频

    关于视频同步的原理可以参考http://dranger.com/ffmpeg/tutorial05.html 和 [原]基础学习视频解码之同步视频 这两篇文章,本文是在这两篇的基础上移植到了Andro ...

  4. 随机以及时间相关函数——C语言描述

    随机相关的函数 头文件 stdlib.h 相关函数 :rand .srand rand( rand C++ Reference ) 函数声明:int rand( void ); rand函数返回一个位 ...

  5. 百度地图隐藏LOGO显示

    在引入地图的页面加入下列样式即可隐藏百度地图左下角的LOGO   <style type="text/css">   .anchorBL{display:none;} ...

  6. PHP不定维数组去除空值

    最近遇到一个问题,是将不定维数组的空值去除,回来研究了一下,写出来了,不知道是否还能优化 写的不好的,如果有好的想法或者好的实现方法,欢迎提出来,如果哪里写错了,也欢迎大牛可以讲解一下 代码如下,欢迎 ...

  7. 理解JavaScript数据类型

    JavaScript有5种基本数据类型: 数值(number):整数和小数(比如1和3.14) 字符串(string):字符组成的文本(比如"Hello World") 布尔值(b ...

  8. es6之数据结构

    1.set的用法 用add方法添加元素,添加的数组不可重复. 可利用set类型添加元素不重复的功能,给数组完成去重的功能 size属性用于获取set元素的长度 { let list =new Set( ...

  9. Visual Studio2015无法启动IIS Express Web 服务器的解决方案

    有时通过VS2015启动项目会弹出提示框:无法启动IIS Express Web服务器 出现这种提示框有可能是因为此项目的解决方案是从别人电脑中拷贝过来的,所以启动会出现错误. 解决办法就是删除解决方 ...

  10. java _this关键字的用法

    1:This关键字可以用于从一个构造方法调用另一个构造方法,可以用于避免重复代码 2:this的第二个用于this.xxx表示成员变量,成员变量的作用范围是  类   避免产生歧义 package c ...