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
",++cnt,ans);
    }
    return 0;
}

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

链接: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,1N1061≤N≤106,1Ni=1Bi106





解法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
");
        else 
            printf("No
");
    }
    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
");
        else 
            printf("No
");
    }
    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;
}




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转字符型)
原文地址:https://www.cnblogs.com/q1204675546/p/9381868.html