简介
原来我写过的一些关于CtCI的代码,于是整理起来,也是怕以后自己会忘记,更可能会找不到。
所以放在这里,和大家分享。
下面都是使用java来实现的。
判断String中的字符是否只出现一次
咱们分两种情况
(1)只有英文字母,也就是说string由26个字母组成(这种方法适用于小的字符范围的情况,不限于只是26个。举一反三)
public boolean isUniqueFor26(String str) {
if (str.length() > 26) {
return false;
}
int marker = 0;
for (int i = 0; i < str.length(); i++) {
int ch = str.charAt(i);
if ((marker & (1 << ch)) != 0) {
return false;
}
marker |= (1 << ch);
}
return true;
}
上面这种写法只需要遍历一遍字符串,时间复杂度很低,同时也不需要额外创建数组,只需要一个int的变量空间。
大体思路就是通过与或操作,利用二进制的数的特点将有限的数字编码标记在了一个二进制数的空间当中。
这种思路值得在更多的场合去运用,学会这种思路就很重要。
(2)第二种情况就是当可选字符的范围较大时,比如是128个字符
public boolean isuniquestr(String string) {
//因为ascii码表示128个字符
if (string.length() > 128) {
return false;
}
boolean[] markers = new boolean[128];
for (int i = 0; i < string.length(); i++) {
int item = string.charAt(i);
if (markers[item]) {
return false;
}
markers[item] = true;
}
return true;
}
这就是比较起初的遍历同时利用额外的数组空间来标记字符的有无。
判断String中的字母是否相同
也就是说面对顺序不同但是字母的个数和种类相同的情况要如何解决。
同样有两种方法:
(1)先做排序,然后利用equals函数得到结果
class method1 {
public String sort(String str) {
char[] arr = str.toCharArray();
Arrays.sort(arr);
return new String(arr);
}
public boolean permutation(String str1, String str2) {
return sort(str1).equals(sort(str2));
}
}
(2)方法二利用额外的空间,也就是利用数据标记个数
class method2 {
public boolean permutation(String str1,String str2) {
if (str1.length() != str2.length()) {
return false;
}
int[] markers = new int[128];
for (int i = 0; i < str1.length(); i++) {
markers[str1.charAt(i)]++;
}
for (int i = 0; i < str1.length(); i++) {
markers[str2.charAt(i)]--;
if (markers[str2.charAt(i)] < 0) {
return false;
}
}
return true;
}
}
只是总结一下原来写过的东西,没什么太深的
欢迎指正
大家共勉