Leetcode 408: Valid Word Abbreviation

问题描述:
A string can be abbreviated by replacing any number of non-adjacent substrings with their lengths. For example, a string such as “substitution” could be abbreviated as (but not limited to):

“s10n” (“s ubstitutio n”)
“sub4u4” (“sub stit u tion”)
“12” (“substitution”)
“su3i1u2on” (“su bst i t u ti on”)
“substitution” (no substrings replaced)
Note that “s55n” (“s ubsti tutio n”) is not a valid abbreviation of “substitution” because the replaced substrings are adjacent.

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

判断是否为合法缩写

思路:
初始设结果字符串为空
abbr逐个遍历,若遇到字符,则加到结果里,调整word中指针;若遇到数字,将该位转化成数字,再查看下一位是否为数字,若是则继续更新数字,若不是则考虑结算本阶段所获得的数字。拿到结算后的数字后,判断该数字是否有效:若数字大于剩下的所有字符长度,则无效返回false;否则把word中这么长的子字符串加到结果里,调整word中的指针,清空num中本轮所获得的数字。

代码改了三遍,有些细节还是没注意:比如说数字部分出现以0开头的时候,因为abbr中所有连续的数字都必须是有效的数字,所以其最高位不能是零。即当sum的值为0且当前字符也为0时,abbr中表示的数字无效。

class Solution {
    public boolean validWordAbbreviation(String word, String abbr) {
        String result = "";
        int wordPointer = 0;
        int num=0;
        for(int i=0; i<abbr.length(); i++){
            if(abbr.charAt(i)>='a'){
                result = result+abbr.charAt(i); //we can add char to string in java
                wordPointer++;
            }
            else{
                if((num==0)&&(abbr.charAt(i)=='0')) return false;
                num=num*10+(abbr.charAt(i)-'0');
                if(((i+1)<abbr.length()&&(abbr.charAt(i+1)>='a'))||(i+1==abbr.length())){
                    if(num>word.length()-wordPointer) return false;
                    else{
                        result = result+word.substring(wordPointer, wordPointer+num);
                        wordPointer=wordPointer+num;
                        num=0;
                    }
                }
            }
        }
        return result.equals(word);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值