【发布时间】:2017-10-29 22:31:28
【问题描述】:
这个问题是在一次求职面试中提出的,我认为这很好,因为有几种方法可以解决它。
说明如下:
- 诸如“internationalization”之类的字符串长度为 20 个字符。它 可以缩写为“i18n”,读作“i - skip 18 characters - n”。
同样,其他缩写如“i16ion”、“internationali2tion”甚至“20”也可以接受。
要跳过的数字可以是任何正整数(没有 0,没有负数 数字),并且字符串可能包含不止一个跳过事件 - 例如,“int3ationa2za1ion”也是可以接受的。
原始字符串不包含数字 - 因此缩写字符串中的每个数字都代表一个跳过。
缩写字符串也可以以跳过开头或结尾 - “6ationalizati2”,例如 例子。
给定两个字符串 - 一个代表原始字符串,另一个代表缩写,确定缩写字符串是否有效。执行此操作的方法必须实现签名
public static boolean equals (String orig, String abbr);
【问题讨论】:
-
我想你不想知道这可以在一行代码中完成吗?以后有时间我会回复的。
-
如果面试官给我这个签名,我会说我认为
equals是一个糟糕的方法名称选择。这根本不符合相等的概念,因为您可以有两个orig字符串“相等 [不是真的]”到相同的abbr,但彼此不相等。isAbbreviationFor或isValidAbbreviation会更好。 -
@ajb - 够狠。虽然我不想在这种情况下纠正我的面试官。
-
@Assafs 我认为向面试官指出这一点是完全正确的。它显示了对所涉及概念的更深入理解,而不仅仅是盲目地遵循说明。
-
好吧,我需要仔细检查细节并写一些解释,但它类似于
return orig.matches(abbr.replaceAll("([1-9][0-9]*)", "\\w{$1}"));
标签: java string algorithm string-matching