这是一道中等难度的字符串题目。本来按照我的想法,我觉得逻辑上没有问题,但是出在JAVA上的细节问题。虽然,我的逻辑方法自己觉得很生硬。
题目
给出一个字符串数组S,找到其中所有的乱序字符串(Anagram)。如果一个字符串是乱序字符串,那么他存在一个字母集合相同,但顺序不同的字符串也在S中。
样例
对于字符串数组["lint","intl","inlt","code"]
返回["lint","inlt","intl"]
我的想法
1.首先通过length,即字符串的长度,从开始扫描,找到长度一致的字符串,然后再比较是否是乱序的。
2.如何比较是否是乱序的呢,我的想法是只要是组成这两个字符串的字符是相同的,就算。那么如何比较两个字符串的字符是否相同呢? 我的想法是通过两个for循环比较,声明两个String []变量,比较这两个。
代码
import java.util.List;
import java.lang.instrument.*;
public class Solution {
public static String[] iteration;
public static String[] temp;
public static String[] compare;
Solution() {};
private static void swap(int i, int j) {
}
private boolean isthesame(String[] a, String[] b) {
for ( int i = 0 ; i < a.length; i ++) {
for ( int j = i; j < b.length; j++) {
if(b[j]==a[i]) {
String tempo = b[j];
b[j] = b[i];
b[i] = tempo;
break;
}
if (j == b.length -1) {
return false;
}
}
}
return true;
}
public String[] anagrams(String[] strs) {
int n = strs.length;
for(int i = 0; i < n; i++) {
for(int j = i + 1; j < n; j++) {
if(strs[j].length() == strs[i].length() ) {
for (int z = 0; z < strs[j].length(); z++) {
this.temp[z]=strs[j].substring(z, z+1);
this.compare[z] = strs[i].substring(z, z+1);
}
}
if (isthesame(this.compare,this.temp)) {
this.iteration[j] = strs[j];
}
}
if(this.iteration.length != 0) {
this.iteration[0] = strs[i];
break;
}
}
return this.iteration;
}
public static void main(String[] args) {
Solution ss = new Solution();
String[] s={"lint","intl","inlt","code"};
try{ss.anagrams(s);}
catch(Exception e) {
System.out.print("error");
}
}
}
调用结果老是出错,我自己测试了一下,应该是错在this.iteration[j] = strs[j];这样的赋值步骤上,由于我还是JAVA新手,这种细节还是不太懂,为什么不能这样赋值呢?
问题:
虽然我自觉想法没错,但是我还是认为这种暴力解法没有优化,接下来继续想更好的方法。