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

一个题目。解决方案

2012-02-04 
一个题目。。给定两个字符串如果字符串中的字符出现的次数相同,则认为两字符串相等。如“aab”和“aba”相等。如何

一个题目。。
给定两个字符串如果字符串中的字符出现的次数相同,则认为两字符串相等。
如“aab”和“aba”相等。
如何高效的实现。

[解决办法]
最起码要遍历这两个字符串吧,O(n),这一步骤可以声明两个长度为255的数组,盛放这些字母的出现次数,然后看一下这两个数组的内容。想不起来更高效的了。
[解决办法]
int i=0,j=0,k; 
boolean same = false; 
String a = new String("aaab"); 
String b = new String("baaa"); 
for(k=(int)'a';k<=(int)'z';k++)

i=0; 
while(i<a.length)
{
if((int)a[i] == k)
{
i++; 
}
}
j=0;
while(j<b.length)
{
if((int)b[j] == k)
{
j++; 
}
}
if(i == j)
{
same =true; 
break; 
}
}

if(same)
{
System.out.println("same"); 
}
一种思路
[解决办法]

探讨
最起码要遍历这两个字符串吧,O(n),这一步骤可以声明两个长度为255的数组,盛放这些字母的出现次数,然后看一下这两个数组的内容。想不起来更高效的了。

[解决办法]
字符串是有一个个字符拼起来的!既然如此我们一样可以把他们拆成一个个字符!
去对比这一个个字符不就可以啦!~具体实现还是LZ自己去做吧……
[解决办法]
期待解决。
[解决办法]
最简单的思路就是,将两个字符串排序,然后进行比较。
[解决办法]
高效的实现还真不知道


帮顶吧
[解决办法]
拆串前先判断两个字符串是否长度一样
[解决办法]
我也感觉先判断长度,如果长度不等就就不相等了,如果长度相等了在分别计算其个数,这样的情况下对于长度不等的情况下是高效的,但是对于真的相等就不行了!
[解决办法]
学习中,等高手解决问题
[解决办法]
比较字符串长度。挺好。
[解决办法]
各位大大请指正!
Java code
    public static void main(String[] args)    {        String s1 = "bbb";        String s2 = "aba";        if (f(s1).equals(f(s2)))        {            System.out.println("相等");        }        else        {            System.out.println("不相等");        }    }        static Map f(String s)    {        Map m = new HashMap();        char c;        int con;        for (int i = 0; i < s.length(); i++)        {            c = s.charAt(i);            con = null == m.get(s) ? 0 : (Integer)m.get(s);            m.put(s.charAt(i), con + 1);        }        return m;    }
[解决办法]
探讨
给定两个字符串如果字符串中的字符出现的次数相同,则认为两字符串相等。
如“aab”和“aba”相等。
如何高效的实现。

[解决办法]
LZ的要求如果纯是英文字母还好搞一些, 要支持Unicode吗?比如是"我不爱?"要等于"不爱我?"
[解决办法]
学习了~~
[解决办法]
正则可以啊
[解决办法]
如果只有ASCII码,一楼的算法应该是最高效的.
如果字符串中还有其它字符.用HashMap来统计字符的重复次数,效率应该不错.HashMap查找一个元素并统计的时间复杂度为O(1).用HashMap来统计,这样的算法论坛中多次曾多次出现。


从字符串中取出第i个字符用indexOf(i),时间复杂应该为O(1);

设两个HashMap<Charactor,Integer>,key为字符,value为重复次数,就可以了。

下来比较两个HashMap。
如果两个HashMap的size()不相同,两个字符串不同,算法结束。
否则,把一个HashMap中的每key和value取出,在另一个HashMap中查找,并比较两者的value值就可以了。

综合起来,用HashMap来实现,时间复杂度为O(n)。n为字符串的长度。

[解决办法]
有时字符串匹配 可以考虑马尔可夫模型
[解决办法]
相同级别的算法之间,效率也是有差别的。
比如:同为O(n*log(n))级别的排序算法有:快排,堆排,归并。但快排的效率一般的情况下高于另外的两种。
[解决办法]
public static boolean isStringsEquals(String s1, String s2) {
char[] arr1 = s1.toCharArray();
char[] arr2 = s1.toCharArray();
Arrays.sort(arr1);
Arrays.sort(arr2);
return Arrays.equals(arr1, arr2);
}

/**
* @param args
*/
public static void main(String[] args) {
String s1 = "aaab";
String s2 = "abaa";

if (isStringsEquals(s1, s2)) {
System.out.println(s1 + " = " + s2);
}
else {
System.out.println(s1 + " != " + s2);
}
}
[解决办法]
学习。。。。。
[解决办法]
学习。。。。。
[解决办法]
如果用N个素数的乘积怎么样?也就是从a-z每个用一个素数来取代,这样乘积相同的话就可以了,这样的话也是O(N),不过应该要更有效率一点
[解决办法]
只有ascii码的情况

Java code
public class TestStringEqual {    public static void main(String[] args) {                        System.out.println( isEqual( "bcbb", "cbbb" ) );                    }        public static boolean isEqual( String a, String b )    {                if( a.length() != b.length() )            return false;                 int[] aChances = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0  };        int[] bChances = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0  };                                char []aChars = a.toCharArray();                char []bChars = b.toCharArray();                for( int i = 0; i < aChars.length; i++ )        {            aChances[aChars[i]-'a']++;            bChances[bChars[i]-'a']++;        }                return Arrays.equals(aChances, bChances);    }    }
[解决办法]
我觉得先第一步先判断长度,长度相等再下午下一步的判断。
[解决办法]
学习!
[解决办法]
String.toCharArray();
Arrays.sort();
equals();
[解决办法]
Java code
        String a = "我不爱?";        String b = "不爱我?";                char [] one = a.toCharArray();        char [] tow = b.toCharArray();                Arrays.sort(one);        Arrays.sort(tow);                if (String.valueOf(one).equals(String.valueOf(tow))) {            System.out.println(true);        }else {            System.out.println(false);        }
[解决办法]
学习
[解决办法]
学习了
[解决办法]

[解决办法]
排序不错的思路呀!
[解决办法]

探讨
我也感觉先判断长度,如果长度不等就就不相等了,如果长度相等了在分别计算其个数,这样的情况下对于长度不等的情况下是高效的,但是对于真的相等就不行了!

[解决办法]
最后一个可以
[解决办法]
unsigned long tab[256];
memset(tab, 0, 256*sizeof(unsigned long));
for (int i = 0; i < nStackSize; i++) //统计数量
tab[pStack[i]]++;

return tab[cb];
[解决办法]
标记下,有时间好好看看。
[解决办法]
完整易懂版,不是最简洁,但易懂。绝对易懂。
import java.io.*;

public class TestString {

/**

* @param 小马哥
*/
public static void main(String[] args) {

System.out.println("请输入两个英文字母组成的字符串");
String s1 = "";
String s2 = "";
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
s1 = br.readLine();
System.out.println("OK!");
s2 = br.readLine();
System.out.println("OK!");

} catch (Exception e) {
}
boolean isSame = true;
s1 = resetString(s1);
s2 = resetString(s2);
for (int i = 0; i < s1.length(); i++) {
if (s1.charAt(i) != s2.charAt(i)) {
isSame = false;
}
}
if (isSame) {
System.out.println("相同");
} else {
System.out.println("不相同");
}

}

/**
* 将参数字符按字母从小大到的顺序排序
* @param s 参数
* @return 排好序列的字符串
*/
public static String resetString(String s) {
//字符串化
char[] ch = s.toCharArray();
//排序
for (int i = 0; i < (ch.length); i++) {
//第I个与第I加1表比较。
for (int j = i + 1; j < (ch.length); j++) {
//后者大则换位置
if (ch[i] > ch[j]) {
char temp = ch[i];
ch[i] = ch[j];
ch[j] = temp;
}
}

}

return new String(ch);
}

}
[解决办法]
感觉二楼是正解.
[解决办法]
探讨
引用:
原样复制到myeclipse调试不成功!

[解决办法]

[解决办法]
学习
[解决办法]
探讨
public static boolean isStringsEquals(String s1, String s2) {
char[] arr1 = s1.toCharArray();
char[] arr2 = s1.toCharArray();
Arrays.sort(arr1);
Arrays.sort(arr2);
return Arrays.equals(arr1, arr2);
}

/**
* @param args
*/
public static void main(String[] args) {
String s1 = "aaab";
String s2 = "abaa";

if (isStringsEquals(s1, s2)) {
System.out.println(s1 + " = " + s2);
}
else {
System.out.println(s1 + " != " + s2);
}
}

[解决办法]
有一种办法只要循环一个字符串
首先比较两个字符串,看其长度是否相等,如果相等的话,
循环其中某一个字符串,.....哎写思路,一下子不知道怎么写,表达不是很好.
代码如下:
Java code
    public class C {    public static void main(String[] args) {        String str = "aab";        String str2 = "aba";        System.out.println(equ(str,str2));            }        public static boolean equ(String str,String str2){        boolean flag = true;        if (str.length() == str2.length()) {            while (!"".equals(str)) {                String c=str.substring(0,1); //截取某个字符串的第一字符                String tempStr=str.replace(c,"");  //用空串替换截取到的字符,                String tempStr2 = str2.replace(c, "");                str2 = tempStr2;                str = tempStr;                if(str.length() != str2.length()){ //然后比较这两个字符串的长度                    flag = false;                }            }        }        return flag;    }} 


[解决办法]
补充一点

Java code
     public static boolean equ(String str,String str2){        boolean flag = true;        if (str.length() == str2.length()) {            while (!"".equals(str)) {                String c=str.substring(0,1); //截取某个字符串的第一字符                String tempStr=str.replace(c,"");  //用空串替换截取到的字符,                String tempStr2 = str2.replace(c, "");                str2 = tempStr2;                str = tempStr;                if(str.length() != str2.length()){ //然后比较这两个字符串的长度                    flag = false;                 [color=#FF0000]break;[/color]  //加上这句可能速度会快点                }            }        }        return flag;    }
[解决办法]
代码还有个问题,两个字符串长度不相等的情况..楼主看的时候留意下
[解决办法]
用正则表达式
String st = "aab";
String stg = "aba";

if (st.matches("[aab]{3}")) {
if (stg.matches("[aab]{3}") {
System.out.println("Equals :" + st + " = " + stg);
}
}
[解决办法]
正则表达式可以解决吧
[解决办法]
先用equals方法?
然后判断长度?
再将字符串拆分一一对比?
学习中...
[解决办法]
UP
[解决办法]
上面的map做法才是正解
只要读一遍写一遍,时间O(n)

热点排行