有效单词缩写
字符串可以用 缩写 进行表示,缩写 的方法是将任意数量的 不相邻 的子字符串替换为相应子串的长度。例如,字符串 “substitution” 可以缩写为(不止这几种方法):
“s10n” (“s ubstitutio n”)
“sub4u4” (“sub stit u tion”)
“12” (“substitution”)
“su3i1u2on” (“su bst i t u ti on”)
“substitution” (没有替换子字符串)
下列是不合法的缩写:
“s55n” (“s ubsti tutio n”,两处缩写相邻)
“s010n” (缩写存在前导零)
“s0ubstitution” (缩写是一个空字符串)
给你一个字符串单词 word 和一个缩写 abbr ,判断这个缩写是否可以是给定单词的缩写。
子字符串是字符串中连续的非空字符序列。
class Solution {
public:
bool validWordAbbreviation(string word, string abbr) {
int abbrsize= abbr.size(),wordsize=word.size();
//游标,记录当前判断的位置
int abbrLen=0;
//num记录字母间的数字大小
int num=0;
for (int i = 0; i < abbrsize; ++i){
if (abbr[i]>='a' && abbr[i]<='z'){
abbrLen+=num+1; //数字加字母的长度
num=0;
//越界或者单词对应位置不相同,直接返回false
if (abbrLen>wordsize || abbr[i]!=word[abbrLen-1]) return false;
}
else{
//遇到了前导0:当前缩写位置上的字符为0,并且num=0
if (!num && abbr[i]=='0') return false;
num=num*10+abbr[i]-'0'; //连续遇到两个数字,要拼接起来
}
}
return abbrLen+num==wordsize;
}
};