classstringwithlevel {String str; intLevel ; PublicStringwithlevel (String str,intLevel ) { This. str =str; This. Level =Level ; }} PublicArraylist<arraylist<string>> findladders (string start, String end, hashset<string>dict) {ArrayList<ArrayList<String>> res =NewArraylist<arraylist<string>>(); HashSet<String> Unvisitedset =NewHashset<string>(); Unvisitedset.addall (DICT); Unvisitedset.add (start); Unvisitedset.remove (end); Map<string, list<string>> nextmap =NewHashmap<string, list<string>>(); for(String e:unvisitedset) {nextmap.put (E,NewArraylist<string>()); } LinkedList<StringWithLevel> queue =NewLinkedlist<stringwithlevel>(); Queue.add (NewStringwithlevel (end, 0)); BooleanFound =false; intFinallevel =Integer.max_value; intCurlevel = 0; intPrelevel = 0; HashSet<String> Visitedcurlevel =NewHashset<string>(); while(!Queue.isempty ()) {Stringwithlevel cur=Queue.poll (); String Curstr=Cur.str; Curlevel=Cur.level; if(Found && curlevel >finallevel) { Break; } if(Curlevel >prelevel) {Unvisitedset.removeall (visitedcurlevel); } prelevel=Curlevel; Char[] Curstrchararray =Curstr.tochararray (); for(inti = 0; I < curstr.length (); ++i) {CharOriginalchar =Curstrchararray[i]; BooleanFoundcurcycle =false; for(Charc = ' a '; C <= ' z '; ++c) {Curstrchararray[i]=C; String Newstr=NewString (Curstrchararray); if(c! = Originalchar &&unvisitedset.contains (NEWSTR)) {Nextmap.get (NEWSTR). Add (CURSTR); if(Newstr.equals (start)) {found=true; Finallevel=Curlevel; Foundcurcycle=true; Break; } if(Visitedcurlevel.add (newstr)) {Queue.add (NewStringwithlevel (NEWSTR, Curlevel + 1)); } } } if(foundcurcycle) { Break; } Curstrchararray[i]=Originalchar; } } if(found) {ArrayList<String> list =NewArraylist<string>(); List.add (start); Getpaths (Start, End, list, Finallevel+ 1, Nextmap, res); } returnRes;}Private voidGetpaths (String cur, string end, arraylist<string> list,intLevel, map<string, list<string>> Nextmap, arraylist<arraylist<string>>Res) { if(Cur.equals (end)) {Res.add (NewArraylist<string>(list)); } Else if(Level > 0) {List<String> Parentsset =nextmap.get (cur); for(String parent:parentsset) {list.add (parent); Getpaths (parent, end, list, level-1, Nextmap, res); List.remove (List.size ()-1); } }}
126. Word Ladder II