zoukankan      html  css  js  c++  java
  • 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转字符型)
  • 相关阅读:
    为同一个元素绑定多个不同的事件,并指向相同的事件处理函数方法
    js获取/设置任意元素中间内容的兼容方法
    js元素事件绑定与解绑兼容代码
    js元素事件的绑定与解绑,绑定事件的区别
    【TFS 2017 CI/CD系列
    【TFS 2017 CI/CD系列
    【TFS 2017 CI/CD系列
    【OPPO主题制作系列
    【SQL Server 学习系列】-- ConnectionTimeout、CommandTimeout和BulkCopyTimeout
    【.Net 学习系列】-- Windows身份模拟(WindowsIdentity.Impersonate)时读取Access数据库
  • 原文地址:https://www.cnblogs.com/q1204675546/p/9381868.html
Copyright © 2011-2022 走看看