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
來源:牛客網

題目描述

月月和華華一起去吃飯了。期間華華有事出去了一會兒,沒有帶手機。月月出於人類最單純的好奇心,打開了華華的手機。哇,她看到了一片的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\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;
}
 
         

 



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轉字符型)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM