一个题目。。
给定两个字符串如果字符串中的字符出现的次数相同,则认为两字符串相等。
如“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");
}
一种思路
[解决办法]
[解决办法]
字符串是有一个个字符拼起来的!既然如此我们一样可以把他们拆成一个个字符!
去对比这一个个字符不就可以啦!~具体实现还是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; }
[解决办法]
[解决办法]
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);
}
}
[解决办法]
感觉二楼是正解.
[解决办法]
[解决办法]
顶
[解决办法]
学习
[解决办法]
[解决办法]
有一种办法只要循环一个字符串
首先比较两个字符串,看其长度是否相等,如果相等的话,
循环其中某一个字符串,.....哎写思路,一下子不知道怎么写,表达不是很好.
代码如下:
- 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)