程序员面试金典练习3

题目:确定两字符串乱序同构
时间限制:3秒  空间限制:32768K  热度指数:25850
本题知识点:  字符串
 算法知识视频讲解

题目描述

给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。这里规定大小写为不同字符,且考虑字符串重点空格。

给定一个string stringA和一个string stringB,请返回一个bool,代表两串是否重新排列后可相同。保证两串的长度都小于等于5000。

测试样例:
"This is nowcoder","is This nowcoder"
返回:true
"Here you are","Are you here"
返回:false
我的代码:
package com.Main.dl;

import java.util.ArrayList;
import java.util.Scanner;

import javax.swing.text.StyledEditorKit.ForegroundAction;

public class Same {
    @SuppressWarnings("unused")
	public static boolean checkSam(String stringA, String stringB) {
    	boolean flag=false;
    	if(stringA.length()!=stringB.length()){
    		flag=false;
		}
    	//考虑空格数量
    	char[] sa=stringA.toCharArray();
    	char[] sb=stringB.toCharArray();
    	int counta=0;
    	int countb=0;
    	for (int i = 0; i < sa.length; i++) {
			if(sa[i]== ' '){
				counta=counta+1;
			}
		}
    	for (int i = 0; i < sb.length; i++) {
			if(sb[i]== ' '){
				countb=countb+1;
			}
		}
    	if(countb!=counta){
    		flag=false;
		}
   	 	//比较两个字符内容是否相等
	   //str2分隔后字符串,分隔结束
    	String[] strA=stringA.split(" ");
    	String[] strB=stringB.split(" ");
    	if(strA.equals(strB)){
    		flag=true;
    	}
    	ArrayList<String> sa1=new ArrayList<String>();
    	ArrayList<String> sb1=new ArrayList<String>();
    	//判断顺序不同的情况
    	for (int i = 0; i < strA.length; i++) {
    		sa1.add(strA[i]);
			}
    	for (int i = 0; i < strB.length; i++) {
    		sb1.add(strB[i]);
			}
    	flag=digui(sa1,sb1);
    	return flag;
    }
    @SuppressWarnings("unused")
	public static boolean digui(ArrayList<String> sa1,ArrayList<String> sb1){
    	boolean flag=false;
    	for (int i = 0; i < sa1.size(); i++) {
			for (int j = 0; j < sb1.size(); j++) {
				if(sa1.get(i).toString().equals(sb1.get(j).toString())){
					sa1.remove(i);
					sb1.remove(j);
					digui(sa1,sb1);
				}
			}
		}
    	if(sa1.size()==0&&sb1.size()==0){
			flag=true;
		}
    	return flag;
    }
		//    给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。这里规定大小写为不同字符,且考虑字符串重点空格。
		//    给定一个string stringA和一个string stringB,请返回一个bool,代表两串是否重新排列后可相同。保证两串的长度都小于等于5000。
		//    测试样例:
		//    "This is nowcoder","is This nowcoder"
		//    返回:true
		//    "Here you are","Are you here"
		//    返回:false
    public static void main(String args[]){
    	 Scanner in=new Scanner(System.in);
	       while(in.hasNextLine()){
	    	   String str=in.nextLine();
	    	   //逗号分隔
	    	   String[] str2=str.split(",");
	    	   boolean flag=checkSam(str2[0],str2[1]);
	    	   System.out.println("返回"+flag);
	       }
    }
}


哎,题目刚开始理解错了,以为只可以调整一个单词的位置,还专门判断了下空格数量是否相等,通过率只有31%,百度了下,分享一下别人的成果。
第一种思路:
package com.Main.dl;

import java.util.Arrays;
import java.util.Scanner;

public class same4 {
	public static boolean checkSam(String stringA, String stringB) {
	    if(stringA.length()!=stringB.length()) //长度不相等,返回false
	        return false;
	    char[] a = stringA.toCharArray(); //把字符串转化为字符数组,然后对字符数组进行排序
	    char[] b = stringB.toCharArray();
	    Arrays.sort(a);
	    Arrays.sort(b);
	    stringA = new String(a);
	    stringB = new String(b);
	    if(stringA.equals(stringB))
	        return true;
	    else
	        return false;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub

   	 Scanner in=new Scanner(System.in);
	       while(in.hasNextLine()){
	    	   String str=in.nextLine();
	    	   //逗号分隔
	    	   String[] str2=str.split(",");
	    	   boolean flag=checkSam(str2[0],str2[1]);
	    	   System.out.println("返回"+flag);
	       }
   
	}
}

超赞的一种解法,理解起来简单代码量还少。Arrays.sort()
第二种思路,检查两个字符串的各字符数是否相同。我们还可以充分利用变位词的定义–组成两个单词的字符数相同–来实现这个算法。我们只需遍历字母表,计算每个字符的次数。然后,比较这两个数字即可。
public boolean checkSam1(String stringA, String stringB) {
    int lenA = stringA.length();
    int lenB = stringB.length();
    if(lenA != lenB){
        return false;
    }
    int[] strA = new int[256];
    int[] strB = new int[256];
    for(int i = 0; i < lenA; i++){
        strA[stringA.charAt(i)]++;
        strB[stringB.charAt(i)]++;
    }
    for(int i = 0;i<256;i++){
        if(strA[i]!=strB[i]){
            return false;
        }
    }
    return true;
}
知识点:Arrays.sort()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值