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

时间:2017-10-29 22:31:29

标签: java string algorithm string-matching

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

描述如下:

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

  • 要跳过的数字可以是任何正整数(不为0,不为负数) 数字),字符串可能包含多个跳过事件 - 例如,“ int3ationa2za1ion ”也是可以接受的。

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

  • 缩写字符串也可以以跳过开头或结尾 - “ 6ationalizati2 ”, 示例

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

public static boolean equals (String orig, String abbr);

1 个答案:

答案 0 :(得分:6)

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

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

这可以通过将所有数字转换为具有量词的点的正则表达式,例如:

"i16ion" -> "i.{16}ion"

\d+表示“一个或多个数字(贪婪)”,$0是对整个匹配的反向引用。

FYI java的String.matches()方法必须与整个字符串匹配,因此您甚至不需要在许多其他方面使用^或尾随$如果语言仅匹配字符串的 part ,则返回true。