zoukankan      html  css  js  c++  java
  • [google面试CTCI] 1-4.判断两个字符串是否由相同字符组成

    【字符串与数组】

    Q:Write a method to decide if two strings are anagrams or not

    题目:写一个算法来判断两个字符串是否为换位字符串。(换位字符串是指组成字符串的字符相同,但位置不同)

    解答:


    方法一:假设为ascii2码字符串,那么可以分配两个256大小的int数组,每个数组用于统计一个字符串各个字符出现的次数,最后,比较这两个int数组,看是否每个元素都相同。时间复杂度为O(n)。

    int anagrams1(char* str1,char* str2){
    	int len1=strlen(str1);
    	int len2=strlen(str2);
    	if(len1 != len2)
    		return 0;
    	int flags1[256],flags2[256];
    	memset(flags1,0,sizeof(flags1));
    	memset(flags2,0,sizeof(flags2));
    	int i;
    	for(i=0;i<len1;++i){
    		++flags1[(int)str1[i]];
    		++flags2[(int)str2[i]];
    	}
    	for(i=0;i<256;++i){
    		if(flags1[i]!=flags2[i])
    			return 0;
    	}
    	return 1;
    }

    方法二:事实上可以在方法一的基础上更进一步简化,只需要分配一个256大小的int数组即可,某个字符在str1中出现,则将int数组对应元素值加1;某个字符在str2中出现,则将int数组对应元素值减去1,最后,只需要看int数组是否全为0。是不是更优雅?呵呵

    int anagrams2(char* str1,char* str2){
    	int len1=strlen(str1);
    	int len2=strlen(str2);
    	if(len1 != len2)
    	return 0;
    	int flags[256];
    	memset(flags,0,sizeof(flags));
    	int i;
    	for(i=0;i<len1;++i){
    		++flags[str1[i]];
    		--flags[str2[i]];
    	}
    	for(i=0;i<256;++i){
    		if(flags[i]!=0)
    		return 0;
    	}
    	return 1;
    }

    方法三:不管三七二十一,我们把两个字符串排序。对排好序后的字符串进行比较。时间复杂度为O(n*logn)。

    int anagrams(char* str1,char* str2){
    	return sort(str1)==sort(str2);
    }

    作者:Viidiot  微信公众号:linux-code

  • 相关阅读:
    冲刺的二阶段第五天
    第二阶段冲刺第四天
    冲刺第二阶段第三天
    《你的灯亮着吗》读书笔记三
    《你的灯亮着吗》读书笔记二
    《你的灯亮着吗》读书笔记一
    数1
    水王续
    输入法之体验
    返回一个二维整数数组中最大联通子数组的和
  • 原文地址:https://www.cnblogs.com/jjdiaries/p/3377517.html
Copyright © 2011-2022 走看看