题解 | 小红的字符串构造
import java.util.Scanner; import java.util.HashSet; import java.util.HashMap; import java.util.List; import java.util.ArrayList; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { String s = new Scanner(System.in).nextLine().trim(); HashSet<String> set = new HashSet<>(); for(int i=0;i<s.length();i++) set.add(s.substring(i,i+1)); if(set.size()<2){System.out.println(-1);} else{ //创建列表 List<String> list = new ArrayList<>(); for(String tmp:set) list.add(tmp); HashMap<String,String> hsp = new HashMap<>(); //列表映射 for(int i=0;i<list.size();i++) hsp.put(list.get(i),list.get((i+1)%list.size())); //纯粹的用String去+=非常耗时,需要用StringBuffer动态字符串! StringBuffer sb = new StringBuffer(); for(int i=0;i<s.length();i++) sb.append(hsp.get(s.substring(i,i+1))); System.out.println(sb.toString()); } } }
对比其他人的题解,我这里强调2个重点:
①字符映射,用来省时间。提前创建a->b,b->c,c->d的映射(set一下原字符串s,把set里面的字符每一个都映射到他的下一个位置,超出size了就取模到第一个,刚好覆盖所有字符集又不会和原位置重合,满足题目要求)
②动态字符串构建,如果用String+=,即便用了方法①,也会超时,原因是String+=是不断创建新字符串,相当于new了很多下,非常耗时,所以我们要用StringBuffer动态字符串,才不会超时。