日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

OpenJudge NOI 1.7 26:字符串最大跨距

發(fā)布時(shí)間:2025/3/17 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenJudge NOI 1.7 26:字符串最大跨距 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【題目鏈接】

OpenJudge NOI 1.7 26:字符串最大跨距

【題目考點(diǎn)】

1. 字符串

2. string類(lèi)

string s, s1;

  • s.find(s1):查找s1在s中第一次出現(xiàn)的位置(從左至右查找),如不存在,返回string::npos。
  • s.rfind(s1):查找s1在s最后一次出現(xiàn)的位置(從右至左查找),如不存在,返回string::npos。
  • s.substr(pos, len): 從下標(biāo)pos起截取長(zhǎng)度為len 的字符串

【解題思路】

解法1:使用字符數(shù)組

先讀入整個(gè)字符串,遍歷字符串,通過(guò)逗號(hào)將整個(gè)字符串拆分為s, s1, s2三個(gè)字符串。
讀到第一個(gè)逗號(hào)時(shí),將該數(shù)組元素改為’\0’,那么該字符串就是題目中說(shuō)的字符串s。
繼續(xù)向后遍歷,遍歷到的字符向s1做數(shù)組填充,讀到第二個(gè)逗號(hào)時(shí)停止。s1末尾添加’\0’。
繼續(xù)向后遍歷到’\0’,將遍歷到的字符填充到s2。至此完成s,s1,s2三個(gè)字符串的構(gòu)造。
以下類(lèi)似找子串的方法。

  • 從前向后遍歷s,看有沒(méi)有一段字符與s1相同。方法為給s1也設(shè)一個(gè)下標(biāo)i1,如果看到相同字符,i1增加。如果不同,i1變?yōu)?。如果i1已經(jīng)等于s1的長(zhǎng)度,那么說(shuō)明s中包含s1,跳出循環(huán)。此時(shí)i指向的是s1在s中最后一個(gè)字符的后一個(gè)位置,如果s中不存在s1,那么i為s的長(zhǎng)度l。最后i的值記為a。
  • 從后向前遍歷s,對(duì)s2也從后向前遍歷,看s中是否存在s2,方法與上面類(lèi)似。如果s中包含s2,i指向s2在s中第一個(gè)字符的前一個(gè)位置,如果s中不包含s2,i的值為-1。最后i的值記為b。
  • 從s1的后一個(gè)字符a到s2的前一個(gè)字符b,包括a和b,這段字符的個(gè)數(shù)即為字符串的跨度。其長(zhǎng)度為b-a+1。如果二者重疊,或其中有一個(gè)不存在b-a+1一定是負(fù)數(shù)。
  • 解法2:使用string類(lèi)

    輸入s,遍歷s,找到兩個(gè)逗號(hào)的下標(biāo)c1,c2。
    s1為從c1+1位置開(kāi)始,長(zhǎng)度為c2-(c1+1)
    s2為從c2+1位置開(kāi)始,到s的末尾
    最后修改s,為從第0位置開(kāi)始,長(zhǎng)度為c1。
    使用成員函數(shù)find()在s中查找子串s1,使用rfind()在s中查找s2。如果二者存在,即可確定s1的最后一個(gè)字符和s2第一個(gè)字符的位置,而后求出s1到s2的跨度。

    【題解代碼】

    解法1:使用字符數(shù)組

    #include <bits/stdc++.h> using namespace std; int main() {char s[355], s1[15], s2[15];cin >> s;//先把整個(gè)字符串讀入s int l, l1 = 0, l2 = 0, i, i1, i2, a, b;//l,l1,l2:s,s1,s2的長(zhǎng)度 i,i1,i2:s,s1,s2的下標(biāo) for(i = 0; s[i] != ',' ; ++i);s[i] = '\0';//去掉第一個(gè)逗號(hào)后面的字符 l = i;//更新s的長(zhǎng)度 i++;while(s[i] != ',')//構(gòu)造s1 s1[l1++] = s[i++];s1[l1] = '\0';i++;while(s[i] != '\0')//構(gòu)造s2s2[l2++] = s[i++];s2[l2] = '\0'; i = i1 = 0;while(i < l){if(s[i] == s1[i1]){i++;i1++;if(i1 == l1)break;}else if(i1 > 0)//如果i1大于0,那么把i1指向第0位置,再做比較 i1 = 0;else//如果i1已經(jīng)為0 s[i]與s1[i1]還是不同,那么看后面的字符 i++;}a = i;//此時(shí)i指向s1最后一個(gè)字符在s中的后一個(gè)位置。如果s中不存在s1,該值為l i = l - 1;//i與i2都指向字符串最后一個(gè)字符 i2 = l2 - 1;while(i >= 0){if(s[i] == s2[i2]){i--;i2--;if(i2 < 0)break;}else if(i2 != l2 - 1)i2 = l2 - 1;elsei--;}b = i;//此時(shí)i指向s2第0個(gè)字符在s中的前一個(gè)位置。如果不存在s2,該值為-1 //此時(shí),s1和s2間的字符為下標(biāo)a到b(包括a和b) if(b - a + 1 >= 0)cout << b - a + 1;elsecout << -1;return 0; }

    解法2:使用string類(lèi)

    #include <bits/stdc++.h> using namespace std; int main() {string s, s1, s2;int i, c1, c2, a, b;//c1,c2:第一個(gè)逗號(hào)和第二個(gè)逗號(hào)的下標(biāo) cin >> s;//先把整個(gè)字符串讀入s for(i = 0; s[i] != ','; ++i);c1 = i;for(i = c1 + 1; s[i] != ','; ++i);c2 = i;s1 = s.substr(c1 + 1, c2 - c1 - 1);s2 = s.substr(c2 + 1);//從c2+1到末尾s = s.substr(0, c1);a = s.find(s1);//a為s1在s中第一次出現(xiàn)時(shí)第一個(gè)字符在s中的位置。 b = s.rfind(s2);//b為s2在s中最后一次出現(xiàn)時(shí)第一個(gè)字符在s中的位置。if(a == string::npos || b == string::npos)//如果s1或s2不存在 {cout << -1;return 0;}a = a + s1.length();//a指向s1最后一個(gè)字符的后一個(gè)位置if(b - a >= 0)cout << b - a;elsecout << -1;return 0; }

    總結(jié)

    以上是生活随笔為你收集整理的OpenJudge NOI 1.7 26:字符串最大跨距的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。