题目
输入一组字符串 判断字符串是否组成环
例如:
输入:aes dwewe ea sd
输出:true
输入:as st ta
输出:false
解题思路
总体思想就是当前字符串找到一个能连接的就继续找能接上的,最后原字符串数组只剩下一个字符串的时候,一个的首是否等于另一个尾。满足就是环。
解体方法
从某一个字符串A开始 判断当前 A的末尾字符 与除A外的其他字符头是否相等?假设存在B满足上述,那么B的末尾判断除A B外剩下的list(移除A、B)。如果一直满足上述,说明一直有字符串可以连接。最后list变成只有一个字符串的时候,判断当前字符串与A是否可以组成环。 两字字符串可以组成环,说明一个的首字符等于另一个的尾。 因为判断环 有环的话 就是从环内任何一个字符串开始 最后都能将list变为只有一个字符的。
源代码
import java.util.*;
public class StrOrgEnd {
public static void main(String[] args) {
System.out.println(isContainsRing(new String[]{"ab", "bf", "ga", "fg"}));
}
private static boolean isContainsRing(String[] str) {
List<String> list = new ArrayList<>(Arrays.asList(str));
String s = list.get(0);//取出第一个字符串
char c = s.charAt(0);
list.remove(0);
if (findCircle(s, list, c)) {
return true;
} else {
return false;
}
}
private static boolean findCircle(String s, List<String> strlist, char c) {
if (strlist.size() == 1 && c == strlist.get(0).charAt(strlist.get(0).length() - 1))//字符串数组长度为2,并且能形成环
if (s.charAt(s.length() - 1) == strlist.get(0).charAt(0))
return true;
char tail = s.charAt(s.length() - 1);
for (int i = 0; i < strlist.size(); i++) {
if (tail == strlist.get(i).charAt(0)) {
List<String> newlist = new ArrayList<>(strlist);
newlist.remove(i);//匹配则删除第i个字符串
if (findCircle(strlist.get(i), newlist, c)) {
return true;
}
}
}
return false;
}
}