变位词
设计一个检查两个单词是否为变位词的算法,也就是说,是不是能够通过改变一个单词的字母顺序,来得到另一个单词。例如单词 tea和 eat是变位词。
代码如下:
方法一:
算法思路:对比两个词中每个字母出现的次数,若26个字母中有出现的次数不相同,那么就不是变位词,否则就是变位词。
import java.util.Scanner; public class AnagramChecker { public static void main(String[] args) { Scanner sc=new Scanner(System.in); char[] arr1=sc.next().toCharArray(); char[] arr2=sc.next().toCharArray(); int[] a=new int[26]; int[] b=new int[26]; if(arr1.length==arr2.length) { for (int i = 0; i < arr1.length; i++) { a[arr1[i]-'a']+=1; b[arr2[i]-'a']+=1; } boolean flag=true; for(int i=0;i<26;i++) { if(a[i]!=b[i]) { flag=false; break; } } if(flag) { System.out.println(String.valueOf(arr1)+"和"+String.valueOf(arr2)+"是变位词"); } }else { System.out.println(String.valueOf(arr1)+"和"+String.valueOf(arr2)+"不是变位词"); } } }
方法二:
算法思路:将两个词都按字母顺序排序,再逐个字符对比是否相同并计数器,若计数器的长度和词的长度相等则为变位词。这里使用了基础的选择排序,时间复杂度较高,所以该方法的效率不高。
import java.util.Scanner; public class Displacement{ public static void main(String[] args) { Scanner sc=new Scanner(System.in); char[] arr1=sc.next().toCharArray(); char[] arr2=sc.next().toCharArray(); { int begin=0; int end=arr1.length-1; while(begin<end) { char min=arr1[begin]; int t=begin; for(int i=begin;i<=end;i++) { if(min>arr1[i]) { min=arr1[i]; t=i; } } arr1[t]=arr1[begin]; arr1[begin]=min; begin++; } } { int begin=0; int end=arr2.length-1; while(begin<end) { char min=arr2[begin]; int t=begin; for(int i=begin;i<=end;i++) { if(min>arr2[i]) { min=arr2[i]; t=i; } } arr2[t]=arr2[begin]; arr2[begin]=min; begin++; } } if(arr1.length==arr2.length) { int count=0; for(int i=0;i<arr1.length;i++) { if(arr1[i]==arr2[i]) { count++; } } System.out.println(count); if(count==arr1.length) { System.out.println(String.valueOf(arr1)+"和"+String.valueOf(arr2)+"是变位词"); } }else { System.out.println(String.valueOf(arr1)+"和"+String.valueOf(arr2)+"不是变位词"); } } }
运行结果如下:
tip:
eclipse自动加入for循环的快捷键是什么?
eclipse自动加入for循环的快捷键是:Alt+/ 。