首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

算法题:比较字符串是不是相等

2012-12-17 
算法题:比较字符串是否相等字符串相等的条件:1、不区分大小写2、不区分顺序比如“aBc”“ABC”“abc”“bac”要求:

算法题:比较字符串是否相等
字符串相等的条件:
1、不区分大小写
2、不区分顺序
比如“aBc”=“ABC”
“abc”=“bac”

要求:要有自己的算法思想。

======
一个方法:
1、先把两个字符串都转化为大写或小写
2、把字符串转化为char数组,然后使用冒泡或比较或其他排序算法实现排序
3、使用equals来判断排序后的连个字符串是否相等

这个方法可行,但是没有体现出做题人自己的算法思想,用的都是系统自带的实现功能。

怎么使用自己的算法来实现这个功能?
[最优解释]

public static boolean equels(String first , String second ) {
first = first.toLowerCase() ;
second = second.toLowerCase() ;

byte[] ch = first.getBytes() ;
byte[] ch1 = second.getBytes() ;
sort(ch);
sort(ch1);

return  new String(ch).equals(new String(ch1));
}


private static void sort(byte[] ch) {
for(int i=0 ; i<ch.length-1 ; i++) {
int lag = ch[i];
int index = i ;
for(int j=i+1 ; j<ch.length ; j++) {
if(lag < ch[j]) {
lag = ch[j];
index = j ;
}
}
ch[index] = ch[i];
ch[i] = (byte) lag ;
}
}


不知合意否?
[其他解释]
参考HashSet的哈希算法。

    public static int getHashCode(String str){
int h=0;
for(Character c:str.toUpperCase().toCharArray()){
    h+=c.hashCode();
}
return h;
    }
    public static void main(String[]args)
    {
System.out.println(getHashCode("abc")==getHashCode("aca"));
    }

[其他解释]
性能越优化越好~
[其他解释]
没有体现出做题人自己的算法思想
----------------
分析的过程,本身就是算法,
用任何程序实现都得用“系统的功能”
[其他解释]
他的意思可能是体现的不够彻底,应该有更好地算法实现方法吧,只是我没有想到
引用:
没有体现出做题人自己的算法思想
----------------
分析的过程,本身就是算法,
用任何程序实现都得用“系统的功能”

[其他解释]
这个用哈希集合比较常规,分别遍历一次两个串就行了。比排序要好的多。
[其他解释]
不知道用哈希集合怎么实现。用HashSet吗?同时还要考虑abcabc和abcaba是不相等的。能否说的详细一点?
引用:
这个用哈希集合比较常规,分别遍历一次两个串就行了。比排序要好的多。

[其他解释]

/**
 * 思路
 * 1.比较长度
 * 2.source转换char数组,去desc匹配,然后删除。
 * @param source
 * @param desc
 * @throws Exception
 */
public static void checkString(String source, String desc) throws Exception {
if (source.length() != desc.length()) {
System.out.println("not equal!");
return;
}
source = source.toLowerCase();
desc = desc.toLowerCase();
char[] sourceChars = source.toCharArray();
for (char sourceChar : sourceChars) {


int index = desc.indexOf(sourceChar);
//不匹配视为不相等
if (index > -1) {
desc = desc.substring(0, index)
+ desc.substring(index + 1, desc.length());
} else {
System.out.println("not equal");
return;
}
}
System.out.println("equal");
}



简单实现而已
[其他解释]
用正则会不会更好点?
一个当参数, 一个当规则
[其他解释]
我不知道这个算不算最好的,当时我也想到这点,但是没有想到要删除,结果可能造成abcb与abca被判断相等。
引用:
Java code123456789101112131415161718192021222324252627282930/**     * 思路     * 1.比较长度     * 2.source转换char数组,去desc匹配,然后删除。     * @param source     * @param desc     * @throws Exception   ……

[其他解释]
引用:
用正则会不会更好点?
一个当参数, 一个当规则

1、先判断2个字符串的位数是否相等,
2、匹配一个字符串由又少个 什么组成。组成规则
3、匹配另一个字符串是否 匹配该规则。
[其他解释]
引用:
参考HashSet的哈希算法。


Java code



123456789101112

    public static int getHashCode(String str){     int h=0;     for(Character c:str.toUpperCase().toCharArray()){         h+=c.hashCode();     ……


有道理
[其他解释]
引用:
引用:
参考HashSet的哈希算法。


Java code



123456789101112

    public static int getHashCode(String str){     int h=0;     for(Character c:str.toUpperCase().toCharArray()){      ……


这个算法不严谨,HASHCODE的规则是:
1、HASHCODE不等时,两值一定不等;
2、HASHCODE相等时,两值不一定相等

所以这个算法在某些特定情况下会有错误,比如
"bc"和"ad"比较,值就为true,显然是不合要求的
[其他解释]
引用:
参考HashSet的哈希算法。


Java code



123456789101112

    public static int getHashCode(String str){     int h=0;     for(Character c:str.toUpperCase().toCharArray()){         h+=c.hashCode();     ……


不严谨,你用你的算法比较"bc"和"ad",结果是错的
[其他解释]
引用:
这个算法不严谨,HASHCODE的规则是:
1、HASHCODE不等时,两值一定不等;
2、HASHCODE相等时,两值不一定相等

所以这个算法在某些特定情况下会有错误,比如
"bc"和"ad"比较,值就为true,显然是不合要求的

对的呢。  
[其他解释]
你说的哈希码相同时,不一定相等,是由这种情况。但你说ad和bc相等,难道你认为hashcode是连着顺序排放的吗?还是别的意思?
引用:

引用:参考HashSet的哈希算法。


Java code



123456789101112

    public static int getHashCode(String str){     int h=0;     for(Character c:str.toUpperCase().toCharArra……

[其他解释]

#include<stdio.h>
#include<string.h>
#include<stdlib.h> 
 
const int length = 128;



int com(char * first, char * second){
int first_array[128];
int second_array[128]; 
char tmp;
int size1, size2;
size1 = strlen(first);
size2 = strlen(second);
 
if(size1 != size2){
return 0; 
}
for(int i=0; i<128; i++){
first_array[i] = 0;
second_array[i] = 0; 

while((tmp = *first) != '\0'){
if(tmp>='A' && tmp<='Z'){
first_array[tmp+32]++; 
}
else{ 
first_array[tmp]++;
}
first++; 
}
 
 while((tmp = *second) != '\0'){
if(tmp>='A' && tmp<='Z'){
second_array[tmp+32]++; 
}
else{ 
second_array[tmp]++;
}
second++; 
}

for(int i=0; i<128; i++){
if(first_array[i] != second_array[i]){
return 0; 
}
}
return 1; 
}
int main(){
char * first_str = "ABC";
char * second_str = "bacd";
if(com(first_str, second_str)){
printf("equal"); 
}
else{
printf("not equal"); 
}
return 0; 


代码写的好烂,先做其他事儿去了,以后再改下
[其他解释]
参考一下这个帖子。
http://bbs.csdn.net/topics/390164362
[其他解释]
能不能就是先把第一个转换成char然后去判断第二个里面有没有,没有就返回不一样,有的话就把当前相同的那个删除,最后如果第二个长度为0第一个也全部判断完了,就相同,如果第一个没有完就不相同。代码就不写了
[其他解释]
参考HashSet的哈希算法。

Java code123456789101112     public static int getHashCode(String str){     int h=0;     for(Character c:str.toUpperCase().toCharArray()){         h+=c.hashCode();     }     return h;     }     public static void main(String[]args)     {     System.out.println(getHashCode("abc")==getHashCode("aca"));     } 


+1
[其他解释]
我来总结一下:
方法1:比较str1和str2的长度,不等,则str1与str2不等。
若相等,先将两个字符都转化为大写或小写,然后对两个字符进行排序,再用equals比较。
方法2:先创建一个26大小的字符数组,依次存入字符0,然后将str1中字符依次遍历,在相应位置上+1;遍历str2,在相应位置上-1,看数组最后是否各位都为0.
方法3:将两字符串转化为大写或小写,设字符串长度为length,从0到length-1,对于str1中的字符,看str2中是否存在,存在则删除,继续遍历,直到str1中字符在str2中找不到对应的字符,则不等,或最终遍历完str1,则相等。

不知道总结的是否全面,欢迎继续补充~
多谢大家
[其他解释]
1 箱排序,申请长度26的空间对应26个字母,初始化为0,遍历第一个串分别在对应位置自增1,遍历第二个串对应位置自减1.遍历的时候不区分大小写,最后循环一遍数组看是否全0判断串是否相等



2 二叉查找树,用第一个串建立一个二叉查找树,第二个串不区分大小写删除二叉查找树的节点,最后删空的话就是相等,其他所有情况都是不等,这个其实就是对应的上面的用Set实现的算法,Set内部还平衡过。效率更好。


这个问题论坛里面好多好多好多好多。。。。。。。
[其他解释]


public class Test {

public static void main(String[] args) {
String str1 = "abcabc";
String str2 = "abcaba";
System.out.println(check(str1, str2));

}

public static boolean check(String str1, String str2) {
if (str1.length() != str2.length()) {
return false;
}
int[] arys = new int[26];
String str = str1 + str2;
for (int i = 0; i < str.length(); i++) {
arys[str.charAt(i) - 'a'] = arys[str.charAt(i) - 'a'] + 1;
}
for (int i = 0; i < arys.length; i++) {
if (arys[i] % 2 != 0) {
return false;
}
}
return true;
}
}

[其他解释]
引用:
参考HashSet的哈希算法。

public static int getHashCode(String str){
    int h=0;
    for(Character c:str.toUpperCase().toCharArray()){
        h+=c.hashCode();
    }
    return h;
    }
    public static void main(String[]args)
    {
    System.out.println(getHashCode("abc")==getHashCode("aca"));
    }


hashCode还是比较靠谱的,效率高。

简单来说,可以这么理解:
1、把a,b,c,d……不分大小写,分别对应1,2,3,4……26,把字符串转化成int[];
2、然后循环取给每个元素一个算法,得出一个值 (相当于求hash值);
3、最后循环叠加这个值,得出最后的总数。  【通过这个总数就可以比较是否相等了】

下面简单模拟一下这个算法,和11楼的hash算法是一个意思,只是分开来写,写得简单明了一些,并且尽量避免使用java的函数:


    // 字符转换成数字,相当于hashCode
    public static int[] getIntArray(String str) {   
        int[] arrRet = new int[str.length()];
        int i = 0;
        for (char ch : str.toUpperCase().toCharArray()) {
            arrRet[i++] = ch - 65;    // 这本身没有必要-65,只不过想变成1234…更好理解
        }
        return arrRet;
    }
    // 求和,原来也可以在循环转化成数字的时候做的,分开只是为了更容易理解。
    public static int sum(int[] arr) {   
        int sum = 0;
        for (int i : arr) {
            sum += i * i * i + 100;  // 随便搞的一个算法,相等于求hashCode
        }
        return sum;
    }


    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "bca";
        int sum1 = sum(getIntArray(s1));
        int sum2 = sum(getIntArray(s2));
        System.out.println(sum1 == sum2 ? "相等" : "不等");
    }


[其他解释]
你这个地方是否应该先对数组进行初始化?
引用:
Java code123456789101112131415161718192021222324252627public class Test {     public static void main(String[] args) {        String str1 = "abcabc";        String str2 = "abcaba";       ……

[其他解释]
补充一下我在24楼写的  忘了大小问题了   加上

toLowerCase()
[其他解释]
支持使用hash算法
[其他解释]
还有,你这个算法考虑的不周全,比如说“abbaccdd”和“abbaaabb”比较,结果也为true。你只保证了两个数组中每个字符的个数和为偶数,但这个地方有漏洞,应该先遍历第一个字符串,在相应位置加1,再遍历第二个字符串减1.
引用:
Java code123456789101112131415161718192021222324252627public class Test {     public static void main(String[] args) {        String str1 = "abcabc";        String str2 = "abcaba";       ……

[其他解释]
用两个 26 的数组M和N,检索一遍字符串,如果遇到‘a’和‘A’就在M[0] 加1,遇到‘b'和‘B’就在M[1]加1。如此类推。
最后比较两个数组是否相等。
[其他解释]
先排序,然后忽视大小写比较,
[其他解释]
引用:
你说的哈希码相同时,不一定相等,是由这种情况。但你说ad和bc相等,难道你认为hashcode是连着顺序排放的吗?还是别的意思?引用:引用:参考HashSet的哈希算法。


Java code



123456789101112

    public stati……

你可以输出出来看看嘛
[其他解释]
提供一种思路,将要比较的字符串转换成顺序排列,然后比较排列。。
[其他解释]
 位图法
凑够6个字
[其他解释]


public static boolean isEqual( final String xstr1, final String xstr2 ) {

StringBuffer str1 = new StringBuffer( xstr1.toLowerCase() );
StringBuffer str2 = new StringBuffer( xstr2.toLowerCase() );
boolean result = true;
Character c = null;

if( str1.length() == str2.length() ) {
int i = str1.length();
for( ; i>=1 ; i=str1.length() ) {
c = str1.charAt( i - 1 );


try {
str1 = str1.deleteCharAt( str1.indexOf( c.toString() ) );
str2 = str2.deleteCharAt( str2.indexOf( c.toString() ) );
}
catch(Exception e) {
result = false;
break;
}
}
}
elseresult = false;

return result;
}


[其他解释]
引用:
引用:参考HashSet的哈希算法。
Java code123456789101112public static int getHashCode(String str){    int h=0;    for(Character c:str.toUpperCase().toCharArray()){        h+=c.hash……


算法不严谨,只采用HASHCODE求和的方式是不能准确判断的
你用你的算法试试这个数据,你的算法得出的结果是相等
"aaaaaaaaaaa" 和 "k"
[其他解释]
引用:
引用:引用:参考HashSet的哈希算法。
Java code123456789101112public static int getHashCode(String str){    int h=0;    for(Character c:str.toUpperCase().toCharArray……

对对,没想这么多,知道会有冲突,没想到这么容易冲突,
还故意调一下Character的hashCode方法,原来也是直接取ascii值
[其他解释]
其实可以建两个 26长度的数组(对应26个字母),遍历字符串,每个字母对应的序号+1,最后检查下两个数组就OK了~~~
如果字符串比较长的时候效果比较明显~~
[其他解释]
取每个字符串的各个字符,转化为INT求和。比较总和是否相等。
[其他解释]
引用:
用两个 26 的数组M和N,检索一遍字符串,如果遇到‘a’和‘A’就在M[0] 加1,遇到‘b'和‘B’就在M[1]加1。如此类推。
最后比较两个数组是否相等。



为什么没有人讨论30楼的想法呢?
你转换大小字符的时候已经遍历了一遍字串数组了后面还要做操作还得遍历。
而用数组计数的方法 只需要遍历一遍,然后再比较下固定长度数组就可以了。


[其他解释]
我给每个字母使用素数编一个号,不区分大小写,比如:
 a-3,b-5,c-7,d-11.........
然后:
"abc" → ['a','b','c'] → [3,5,7] →3*5*7 = 105
"CaB" → ['C','a','B'] → [7,3,5] 
然后:
tmp
[7,3,5].each(fn(i){
 tmp = 105/i
});
tmp == 0 ?"相等":"不相等"
[其他解释]
引用:
1 箱排序,申请长度26的空间对应26个字母,初始化为0,遍历第一个串分别在对应位置自增1,遍历第二个串对应位置自减1.遍历的时候不区分大小写,最后循环一遍数组看是否全0判断串是否相等

2 二叉查找树,用第一个串建立一个二叉查找树,第二个串不区分大小写删除二叉查找树的节点,最后删空的话就是相等,其他所有情况都是不等,这个其实就是对应的上面的用Set实现的算法,Set……



第一种所说的箱排序比较高效,算法复杂度是O(n),最好情况为O(1),最坏情况为O(n)。下面使用JavaScript展示一下箱排序的实现,为了支持UTF-8中所有的字符,实现稍微有点变形:
function assertStrEqual(str1, str2) {
    var charMap = {}, 
        c,
        i,
        len1 = str1.length,
        len2 = str2.length;

    if (len1 != len2) {
        return false;
    }

    for (i = len1; i--;) {
        c = str1.charAt(i).toLowerCase();
        charMap[c] = (charMap[c] 


[其他解释]
 0) + 1;
    }

    for (i = len2; i--;) {
        c = str2.charAt(i).toLowerCase();
        if (charMap[c]) {
            charMap[c]--;
        } else {
            return false;
        }
    }

    for (var key in charMap) {
        if (charMap.hasOwnProperty(key) && charMap[key] != 0) {
            return false;
        }
    }

    return true;
}


[其他解释]
两string转小再转char,然后异或。结果为0就相等
[其他解释]
26个字母转成ascii码 其中a=a+0*26 b=b+1*26 字母(X)= x + (当前所在位)*26; 
那么一个字符串的字母的和 和另外一个字符串字母和 比较是否相等 相等一样不相等不一样 
[其他解释]
public static void main(String[] args) {
// TODO Auto-generated method stub
aaa a = new aaa();
List list1 = a.getList("asdf");
List list2 = a.getList("fdsa");
String n1 ="";
int n2 = 0;
int n3 = 0;
for (int i = 0; i < list1.size(); i++) {
n1 = list1.get(i).toString();
for (int j = 0; j < list1.size(); j++) {
if(n1.equals(list1.get(j))){
n2++;
}
}
for (int j = 0; j < list2.size(); j++) {
if(n1.equals(list2.get(j))){
n3++;
}
}
if(n2 != n3){
System.out.println("两个字符串不相等!");
}
}
System.out.println("两个字符串相等!");
}

// 转化为list
public List getList(String str) {
List list = new ArrayList();
for (int i = 0; i < str.length(); i++) {
if (i == 0) {
list.add(str.substring(0, 1));
} else {
list.add(str.substring(i, i + 1));
}
}
return list;
}
[其他解释]

import java.util.ArrayList;
import java.util.List;

public class Tests {
public static void main(String[] args) {
Tests test = new Tests();
List list1 = test.getList("asdf");
List list2 = test.getList("fdsa");
String n1 = "";
int n2 = 0;
int n3 = 0;
for (int i = 0; i < list1.size(); i++) {
n1 = list1.get(i).toString();
for (int j = 0; j < list1.size(); j++) {


if (n1.equals(list1.get(j))) {
n2++;
}
}
for (int j = 0; j < list2.size(); j++) {
if (n1.equals(list2.get(j))) {
n3++;
}
}
if (n2 != n3) {
System.out.println("两个字符串不相等!");
}
}
System.out.println("两个字符串相等!");
}

// 转化为list
public List getList(String str) {
List list = new ArrayList();
for (int i = 0; i < str.length(); i++) {
if (i == 0) {
list.add(str.substring(0, 1));
} else {
list.add(str.substring(i, i + 1));
}
}
return list;
}
}



第一次发这种代码格式的。。郁闷 上面的发完就感觉不对

热点排行
Bad Request.