【算法设计与分析基础】变位词 设计一个检查两个单词是否为变位词的算法,也就是说,是不是能够通过改变一个单词的字母顺序,来得到另一个单词。例如单词 tea和 eat是变位词。(Java)

变位词

设计一个检查两个单词是否为变位词的算法,也就是说,是不是能够通过改变一个单词的字母顺序,来得到另一个单词。例如单词 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+/ 。

  • 19
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值