題目1:實現一個算法,確定一個字符串的所有字符是否全都不同。假使不允許使用額外的數據結構,又如何處理?
對於這樣的題目,首先要考慮字符串的編碼方式,是Unicode還是ASCⅡ。假設使用ASCⅡ,有256個字符。
下面是具體的代碼實現:
package com.czl.question;
public class TestStr {
public boolean isUniqueChars(String str){
if (str.length() > 256) {
return false;
}
boolean[] char_set = new boolean[256];
for (int i = 0; i < str.length(); i++) {
int val = str.charAt(i);
if (char_set[val]) {//如果這個字符已經出現過,返回false
System.out.println("有重複");
return false;
}
char_set[val] = true;
}
System.out.println("沒有重複");
return true;
}
public static void main(String[] args) {
String string = "14124235qwertymdaldnmzd";
TestStr testStr = new TestStr();
testStr.isUniqueChars(string);
}
}
此種解法的時間複雜度爲
如果,將字符串中的每一個字符與其餘字符進行比較,不需要考慮字符類型,這種方法的時間複雜度爲
package com.czl.question;
public class TestUniqueStr {
public boolean isUnique(String str){
char[] tempchar = str.toString().toCharArray();
for (int i = 0; i < tempchar.length; i++) {
for (int j = i + 1; j < tempchar.length; j++) {
if (tempchar[i] == tempchar[j]) {
System.out.println("有重複");
return false;
}
System.out.println("沒有重複");
return true;
}
}
return true;
}
public static void main(String[] args) {
String string = "qwerabc";
TestUniqueStr tus = new TestUniqueStr();
tus.isUnique(string);
}
}
題目2:給定兩個字符串,請編寫程序,確實其中一個字符串的字符重新排列後,能否變成另一個字符串。
分析:首先,針對變位詞比較是否區分大小寫,一般字符串中存在的空格是否需要考慮,比較兩個字符串時,只要兩者長度不同,就不是變位詞。
解法一:排序字符串
若兩個字符串互爲變位詞,那麼他們擁有同一組字符,自不過順序不同。因此,對字符串排序,組成兩個變位詞的字符就會有相同的順序,比較排序後的字符串即可。
public class Question2 {
public String sort(String s){
char[] content = s.toString().toCharArray();
java.util.Arrays.sort(content);
return new String(content);
}
public boolean permutation(String s,String t){
if (s.length() != t.length()) {
return false;
}
return sort(s).equals(sort(t));
}
public static void main(String[] args) {
Question2 q = new Question2();
String s = "goodod";
String t = "doodog";
System.out.println(q.permutation(s, t));
}
}
解法二:檢查兩個字符串的各字符數是否相同
根據變位詞的定義,可以知道組成兩個變位詞的字符數相同。只需要遍歷字母表,計算每個字符出現的次數,然後比較兩個數組即可。
public class Question2_1 {
public boolean permutation(String s,String t){
if (s.length() != t.length()) {
return false;
}
int[] letters = new int[256];//假設條件
char[] char_set = s.toString().toCharArray();
for (char c : char_set) {//計算字符串s中每個字符出現的次數
letters[c]++;
}
for (int i = 0; i < t.length(); i++) {
int c = (int)t.charAt(i);
if (--letters[c] < 0) {
return false;
}
}
return true;
}
public static void main(String[] args) {
Question2_1 q = new Question2_1();
String s = "goodmoon";
String t = "noom!doog";
String t1 = "nooomdog";
System.out.println(q.permutation(s, t));
System.out.println(q.permutation(s, t1));
}
}