OpenJudge NOI 1.7 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)似找子串的方法。
解法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)題。
- 上一篇: java计时器工作方法,java-摆动计
- 下一篇: android richtext显示ht