有一组单词,请编写一个程序,在数组中找出由数组中字符串组成的最长的串A,即A是由其它单词组成的(可重复)最长的单词。
给定一个string数组str,同时给定数组的大小n。请返回最长单词的长度,保证题意所述的最长单词存在。
测试样例:
["a","b","c","ab","bc","abc"],6
返回:3
解析:遇到这种求最值的问题,当和序列顺序无关时,先排序一般来说是没错的。按字符串长度正向排列后,从最后一个字符串开始,在前面所有的子串中匹配该字符串的子串。若在前面所有子串的匹配过程中,该字符串被匹配至长度为0了,说明该串可以被组成,否则进入下一个字符串。
Tips:因为子串可以重复,所以可以使用类似replaceAll的函数将找到的子串消掉。另外,排序方法任选,但冒泡排序最容易写,也可以使用类似Comparator的类(C语言可以传入函数作为参数)。
代码:
public int getLongest(String[] str, int n) {
for (int i = 0; i < n; ++i) {
boolean flag = false;
for (int j = n - 1; j > i; --j) {
if (str[j].length() < str[j - 1].length()) {
String temp = str[j];
str[j] = str[j - 1];
str[j - 1] = temp;
flag = true;
}
}
if (!flag) {
break;
}
}
for (int i = n - 1; i >= 0; --i) {
String temp = str[i];
for (int j = i - 1; j >= 0 && temp.length() > 0; --j) {
if (temp.contains(str[j])) {
temp = temp.replaceAll(str[j], "");
}
if (temp.length() == 0) {
return str[i].length();
}
}
}
return 0;
}