比较字符串及其有效性的缩写

Ass*_*afs 1 java string algorithm string-matching

这个问题在求职面试中呈现给我,我认为这很好,因为有几种方法可以解决它.

描述如下:

  • 诸如" 国际化 "之类的字符串长度为20个字符.它可以缩写为" i18n ",其内容为" i - 跳过18个字符 - n ".
  • 类似地,接受诸如" i16ion "," internationali2tion "甚至" 20 "的其他缩写.

  • 要跳过的数字可以是任何正整数(没有0,没有负数),并且该字符串可能包含多个跳过事件 - 例如," int3ationa2za1ion "也是可接受的.

  • 原始字符串不包含数字 - 因此缩写字符串中的每个数字都表示跳过.

  • 缩写字符串也可以以跳过开头或结尾 - 例如" 6ationalizati2 ".

给定两个字符串 - 一个表示原始字符串,另一个表示缩写,确定缩写字符串是否有效.执行此操作的方法必须实现签名

public static boolean equals (String orig, String abbr);
Run Code Online (Sandbox Code Playgroud)

Boh*_*ian 6

我真的不应该回答这个,因为你没有显示你的代码,但我无法抗拒,因为代码太酷了:

public static boolean equals (String orig, String abbr) {
    return orig.matches(abbr.replaceAll("\\d+", ".{$0}"));
}
Run Code Online (Sandbox Code Playgroud)

这通过将所有数字转换为与量词相对应的点的正则表达式来实现,例如:

"i16ion" -> "i.{16}ion"
Run Code Online (Sandbox Code Playgroud)

\d+表示"一个或多个数字(贪婪)",$0是对整个比赛的反向引用.

FYI java的String.matches()方法必须匹配整个字符串,所以你甚至不需要在许多其他语言中返回true的前导^或尾随$,如果它只匹配字符串的一部分.