将一个字符串数组中的字母按照以下规则排列:表中任何单词的首字母与其前面单词的尾字母相同! 要求:字符串只由小写字母构成,且每个字符串长度在2-100之间
import java.util.ArrayList; import java.util.Iterator; public class Test { public static int canArrangeWords(String[] arrys) { ArrayList<String[]> arry = new ArrayList<String[]>(); ArrayList<String> alist = new ArrayList<String>(); ; for (int ii = 0; ii < arrys.length; ii++) { arry.add(arrys); //为arry分配内存空间; } if (jmarrys(arrys)) //判断字符串数组中的字符串是否满足要求; { //第i1次进行字符串提取,找到符合要求的字符串将其保持至alist中,并在数组中删除该字符串;循环执行,直到数组中只剩一个元素; //循环次数为arry.size()-1,表示每次提取字符串,需要数组中存在至少两个元素; for (int i1 = 0; i1 < arry.size() - 1; i1++) { String[] split = null; ArrayList<String> aaList = new ArrayList<String>(); String[] lingshi = arry.get(i1); if (tiqu(lingshi) != null) { //判断所提取的字符串是否为空; split = tiqu(lingshi).split("\\+"); //将字符串按+号分割,第一个元素为提取的字符串,第二个元素为该字符串尾字母匹配的字符串索引; alist.add(split[0]); //获取与提取字符串尾字母匹配的字符串,并将其放置字符串数组第一位; int b1 = Integer.parseInt(split[1]); String st = lingshi[0]; lingshi[0] = lingshi[b1]; lingshi[b1] = st; } //在字符串数组中删除所提取的字符串,并将删除后的数组赋给一个新的字符串数组, for (int k = 0; k < arry.get(i1).length; k++) aaList.add(arry.get(i1)[k]); aaList.remove(split[0]); String[] newText = new String[aaList.size()]; arry.set(i1 + 1, aaList.toArray(newText)); } //当字符串数组中只剩下最后一个元素时,直接将该元素添加到alist中; String[] lingshi2 = arry.get(arry.size() - 1); alist.add(lingshi2[0]); } if (alist.size() == arrys.length) { Iterator<String> iterator = alist.iterator(); while (iterator.hasNext()) { String testString = (String) iterator.next(); System.out.print(testString + " "); } System.out.println(); return 1; } return -1; } /** * tiqu(String[] arrys):用于提取字符串数组中,其尾字母在数组中存在匹配首字母项, * 且其首字母在数组中不存在匹配项的字符串; * * @param arrys:传入一个字符串数组; * @return:用于返回所提取字符串值及其索引和,与该字符串尾字母匹配的字符串索引; */ public static String tiqu(String[] arrys) { String str22 = null; outer: for (int i = 0; i < arrys.length; i++) { for (int j = 0; j < arrys.length; j++) { if (arrys[i] == arrys[j]) continue; if (equal(arrys[i], arrys[j])) { for (int j1 = 0; j1 < arrys.length; j1++) { if (arrys[i] == arrys[j1]) continue; if (equal(arrys[j1], arrys[i])) { continue outer; } else if (!equal(arrys[j1], arrys[i])) { str22 = String.valueOf(j); return arrys[i] + "+" + j; } } } } } return null; } /** * equal():用于判断a1的尾字母和a2的首字母是否相等; * * @return 相等返回true,否则返回false; */ public static boolean equal(String a1, String a2) { if ((a1 != null) && (a2 != null)) { char[] ch1 = a1.toCharArray(); char[] ch2 = a2.toCharArray(); if (ch1[ch1.length - 1] == ch2[0]) return true; } return false; } public static boolean jmarrys(String[] arrys) { int l = arrys.length; for (int i = 0; i < l; i++) { char[] ch = arrys[i].toCharArray(); int l1 = ch.length; if (l1 >= 2 && l1 <= 100) { for (int j = 0; j < l1; j++) { if (ch[j] >= 'a' && ch[j] <= 'z') return true; } } } return false; } public static void main(String[] args) { String[] strings = {"dfgc", "abcd", "cdaf", "fe", "emn"}; int s = canArrangeWords(strings); System.out.println(s); } }