力扣 [408] [简单] [有效单词缩写]

408. 有效单词缩写

难度简单28收藏分享切换为英文接收动态反馈

给一个 非空 字符串 s 和一个单词缩写 abbr ,判断这个缩写是否可以是给定单词的缩写。

字符串 "word" 的所有有效缩写为:

["word", "1ord", "w1rd", "wo1d", "wor1", "2rd", "w2d", "wo2", "1o1d", "1or1", "w1r1", "1o2", "2r1", "3d", "w3", "4"]

注意单词 "word" 的所有有效缩写仅包含以上这些。任何其他的字符串都不是 "word" 的有效缩写。

注意:
假设字符串 s 仅包含小写字母且 abbr 只包含小写字母和数字。

示例 1:

给定 s = "internationalization", abbr = "i12iz4n":

函数返回 true.

示例 2:

给定 s = "apple", abbr = "a2e":

函数返回 false.

----------------------------------------分割线----------------------------------------------

思路:主串(不带数字)和子串(带数字)各一个指针,子串指针遇到数字之后,主串进行相同数字的指针便宜。有一个坑,就是子串可能会出现多位数字,要自己转换。

int get_offset(char*q,int *weishu)
{
    int offset=0;
    int wei=0;
    while(((*q)>='0')&&((*q)<='9')){
        wei+=1;
        offset = offset*10+((*q)-'0');
        q++;
    }
    *weishu = wei;
    return offset;
}

bool validWordAbbreviation(char * word, char * abbr){
    char *p = word;
    char *q = abbr;
    int slen = strlen(word);
    int len_tmp=0;
    int offset=0;
    int weishu=0;

    while(((*p)!='\0')&&((*q)!='\0')){
        if(((*q)>='1')&&((*q)<='9')){
            offset = get_offset(q, &weishu);
            len_tmp = offset+(p-word);
            if(len_tmp > slen){
                //printf("((p-word)+((*q)-'0'))= %d  len=%d\n",((p-word)+((*q)-'0')),slen);
                return false;
            }
            else {
                p+=offset;
                q+=weishu;
            }
        } else {
            if((*p)==(*q)){
                p+=1;
                q+=1;
            } else {
                return false;
            }
        }
    }
    
    if((*p)!=(*q))
        return false;
    return true;
}

你可能感兴趣的:(力扣刷题)