算法题:比较字符串是否相等
字符串相等的条件:
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 ;
}
}
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.比较长度
* 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");
}
#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;
}
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;
}
}
// 字符转换成数字,相当于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 ? "相等" : "不等");
}
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;
}
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;
}
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;
}
}