博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Valid Word Abbreviation 验证单词缩写
阅读量:7208 次
发布时间:2019-06-29

本文共 2419 字,大约阅读时间需要 8 分钟。

Given a non-empty string s and an abbreviation abbr, return whether the string matches with the given abbreviation.

A string such as "word" contains only the following valid abbreviations:

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

Notice that only the above abbreviations are valid abbreviations of the string "word". Any other string is not a valid abbreviation of "word".

Note:

Assume s contains only lowercase letters and abbr contains only lowercase letters and digits.

Example 1:

Given s = "internationalization", abbr = "i12iz4n":Return true.

Example 2:

Given s = "apple", abbr = "a2e":Return false.

这道题让我们验证单词缩写,关于单词缩写LeetCode上还有两道相类似的题目和。这道题给了我们一个单词和一个缩写形式,让我们验证这个缩写形式是否是正确的,由于题目中限定了单词中只有小写字母和数字,所以我们只要对这两种情况分别处理即可。我们使用双指针分别指向两个单词的开头,循环的条件是两个指针都没有到各自的末尾,如果指向缩写单词的指针指的是一个数字的话,如果当前数字是0,返回false,因为数字不能以0开头,然后我们要把该数字整体取出来,所以我们用一个while循环将数字整体取出来,然后指向原单词的指针也要对应的向后移动这么多位数。如果指向缩写单词的指针指的是一个字母的话,那么我们只要比两个指针指向的字母是否相同,不同则返回false,相同则两个指针均向后移动一位,参见代码如下:

解法一:

class Solution {public:    bool validWordAbbreviation(string word, string abbr) {        int i = 0, j = 0, m = word.size(), n = abbr.size();        while (i < m && j < n) {            if (abbr[j] >= '0' && abbr[j] <= '9') {                if (abbr[j] == '0') return false;                int val = 0;                while (j < n && abbr[j] >= '0' && abbr[j] <= '9') {                    val = val * 10 + abbr[j++] - '0';                }                i += val;            } else {                if (word[i++] != abbr[j++]) return false;            }        }        return i == m && j == n;    }};

下面这种方法和上面的方法稍有不同,这里是用了一个for循环来遍历缩写单词的所有字符,然后用一个指针p来指向与其对应的原单词的位置,然后cnt表示当前读取查出来的数字,如果读取的是数字,我们先排除首位是0的情况,然后cnt做累加;如果读取的是字母,那么指针p向后移动cnt位,如果p到超过范围了,或者p指向的字符和当前遍历到的缩写单词的字符不相等,则返回false,反之则给cnt置零继续循环,参见代码如下:

解法二:

class Solution {public:    bool validWordAbbreviation(string word, string abbr) {        int m = word.size(), n = abbr.size(), p = 0, cnt = 0;        for (int i = 0; i < abbr.size(); ++i) {            if (abbr[i] >= '0' && abbr[i] <= '9') {                if (cnt == 0 && abbr[i] == '0') return false;                cnt = 10 * cnt + abbr[i] - '0';            } else {                p += cnt;                if (p >= m || word[p++] != abbr[i]) return false;                cnt = 0;            }        }        return p + cnt == m;    }};

本文转自博客园Grandyang的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
php中将SimpleXMLElement Object数组转化为普通数组
查看>>
docker学习(7) docker-compose使用示例
查看>>
Android 推断当前Activity是不是最后一个Activity 以及 应用或Activity是否存在
查看>>
【Android】6.3 ProgressDialog
查看>>
设计模式六大原则——迪米特法则(LoD)
查看>>
HtmlAgilityPack 之 HtmlNode类
查看>>
[转]Java Web基础——Action+Service +Dao三层的功能划分
查看>>
ngx.location.capture 只支持相对路径,不能用绝对路径
查看>>
自己在OC考试中的试题
查看>>
向 Git 服务器添加 SSH 公钥
查看>>
Lua学习笔记5:类及继承的实现
查看>>
Vagrant工具
查看>>
如何使用 Android Studio 的 git hub 功能
查看>>
UML应用:业务内涵的分析抽象&amp;表达
查看>>
eclipse菜单解释及中英对照《二》
查看>>
模拟易企秀
查看>>
CDOJ 1401 谭爷的黑暗沙拉 数学
查看>>
MySQL索引类型总结和使用技巧以及注意事项
查看>>
Asp.net禁用页面缓存的方法总结
查看>>
MyEclipse 10, 2013, 2014 破解、注册码
查看>>