问题描述
小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。
例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123"、"34"、"8" 和 "34"。不同的整数有三个,即 "123"、"34" 和 "8"。
注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。
测试样例
样例1:
输入:
word = "a123bc34d8ef34"
输出:3
样例2:
输入:
word = "t1234c23456"
输出:2
样例3:
输入:
word = "a1b01c001d4"
输出:2
解题思路
从字符串中提取并去除前导零后的数字子串,然后统计不同的数字子串数量。
-
变量初始化:
cpp string s1 = ""; int flag = 0; set<string> st;s1: 用来暂时存储提取的数字子串。st: 一个set<string>用来存储不同的数字子串。set会自动去重,即相同的数字子串只会存储一次。
-
遍历字符串:
cpp for(int i = 0; i < word.length();){ if(word[i] < '0' || word[i] > '9'){ i ++; }else{ while(i < word.length() && word[i] >= '0' && word[i] <= '9'){ s1 += word[i]; i ++; }for (int i = 0; i < word.length();):使用一个for循环遍历整个字符串word。if (word[i] < '0' || word[i] > '9'): 如果当前字符不是数字,则直接跳过这个字符(即i++)。- 否则(即当前字符是数字),进入
else块,继续通过while循环提取连续的数字字符。
-
提取数字子串:
cpp while(i < word.length() && word[i] >= '0' && word[i] <= '9'){ s1 += word[i]; i ++; }- 这个
while循环在字符串中提取连续的数字字符,并将这些数字字符追加到s1中。 - 通过
i++来推进i,直到没有更多的数字字符可以提取,或者已达到字符串末尾。
- 这个
-
处理数字子串:
cpp reverse(s1.begin(),s1.end()); while(s1.size() > 1 && s1.back() == '0') s1.pop_back();reverse(s1.begin(), s1.end()): 将提取到的数字子串反转。反转的目的是去除子串中的前导零(因为数字子串可能会有零字符)。while(s1.size() > 1 && s1.back() == '0') s1.pop_back();: 如果数字子串的末尾是零字符(即反转后的前导零),就不断去除这些零,直到没有零字符或子串只有一个字符为止。这里做的是去掉数字子串的前导零。
-
存储到集合:
cpp if(s1 != "") st.insert(s1); s1 = "";- 如果提取的数字子串
s1非空,将其插入到setst中。由于set会自动去重,因此相同的数字子串只会存储一次。 - 重置
s1为空字符串,为下一个数字子串做准备。
- 如果提取的数字子串
代码示例
#include <algorithm>
#include <iostream>
#include <string>
#include <set>
using namespace std;
int solution(string word) {
// write code here
string s1 = "";
int flag = 0;
set<string> st;
for(int i = 0; i < word.length();){
if(word[i] < '0' || word[i] > '9'){
i ++;
}else{
while(i < word.length() && word[i] >= '0' && word[i] <= '9'){
s1 += word[i];
i ++;
}
reverse(s1.begin(),s1.end());
while(s1.size() > 1 && s1.back() == '0') s1.pop_back();
if(s1 != "") st.insert(s1);
s1 = "";
}
}
// for(auto item = st.begin();item != st.end(); item ++){
// cout << *item << endl;
// }
return st.size();
}