题目: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. 关于一篇对epoll讲的比较好的一篇文章

    原文地址http://www.cnblogs.com/lojunren/p/3856290.html 前言 I/O多路复用有很多种实现.在linux上,2.4内核前主要是select和poll,自Li ...

  2. 阅读HandlerInterceptor接口源码的理解

    一.阅读接口类注释 我先理解的方法,方法都看懂了类注释自然而然明白了.所以此处略. 二.阅读preHandle()方法注释 Intercept the execution of a handler. ...

  3. swift的clourse:字面量化的函数、将函数字面量化-与函数的类型签名相同

    1.clourse的签名与函数的签名相同: 所以两者可以相互赋值: 2.可以将函数(表达式)字面量化: 因为可以字面量化,所以和其它的值(变量)没有任何区别,可以存在变量存在的任何地方: 3.clou ...

  4. vs使用libevent

    1.下载最新libevent-2.1.8-stable,并解压 2.使用vs2013 工具这里使用x64,这里更新一下,改为使用x86 进入到libevent目录 运行 nmake /f Makefi ...

  5. 有gridview汇出word和excel

    private void Export(GridView _gv, string filetype, string FileName)    {        if (filetype == &quo ...

  6. R语言学习笔记1——R语言中的基本对象

    R语言,一种自由软件编程语言与操作环境,主要用于统计分析.绘图.数据挖掘.R本来是由来自新西兰奥克兰大学的Ross Ihaka和Robert Gentleman开发(也因此称为R),现在由“R开发核心 ...

  7. 使用SuperMap Deskpro 6R.NET生成地图缓存

    使用说明 “地图缓存”按钮,用来对二维地图数据生成缓存文件,优化地图的浏览效果. 操作步骤 1.单击功能区>“数据”选项卡>“生成缓存”组中的“地图缓存”按钮. 2.弹出如下所示“生成地图 ...

  8. 关于JavaScript中省略元素对数组长度的影响

    在学习<JavaScript权威指南>第六版的第7.1节中通过数组直接量创建数组时,我们可以不给数组的某个元素赋值,它就会使undefined.虽然是undefined,但我们调用数组对象 ...

  9. HDU 1250 Hat's Fibonacci(大数相加)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1250 Hat's Fibonacci Time Limit: 2000/1000 MS (Java/Ot ...

  10. jFinal 2.2入门学习之二:使用sqlserver数据库学习搭建jfinal-demo框架(MySQL的话就不需要看这个了)

    1.去官网下载最新的jfinal_Demo(我这是JFinal-2.2) 2.解压demo源码,eclipse导入项目 3.本地创建数据库,修改信息,(注意:如果sqlserver端口号冲突,需要配置 ...