串内无重复字符
题目:
实现一个算法,确定一个字符串的所有字符是否全都不同。假使不允许使用额外的数据结构,该如何处理?
思路:
本题就是要确定一个字符串内所有字符均只出现了一次;
需要注意的是本题并未说明是ASCII字符串还是Unicode字符串,这里就按照ASCII字符串处理,已知ASCII编码中共128个字符;
创建一个数组,相当于ASCII码中128个字符的位置。
public class Main{
static int []flag = new int[128]; //对应ASCII码表
public static boolean solve(String instring){
for(int i=0;i<instring.length();i++){
if(flag[instring.charAt(i)] == 0) flag[instring.charAt(i)] = 1;
else return false;
}
return true;
}
}
public static void main(String[] args) {
String instring = "abcdseb";
System.out.print(solve(instring));
}
}
翻转字符串
问题:
实现一个算法,翻转一个给定的字符串。
public class Main{
public static void main(String[] args) {
System.out.println(reverse("this is my world"));
}
public static String reverse(String str){
StringBuffer sn = new StringBuffer(str);
return sn.reverse().toString();
}
}
变形词
问题:
给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串;
这里规定大小写为不同字符,且考虑字符串中的空格。
方法一:
import java.util.Arrays;
public class Main{
public static void main(String[] args) {
String A = "how are you";
String B = "how Are You";
System.out.println(solve(A,B));
}
public static boolean solve(String A,String B){
int len = A.length();
int len1 =B.length();
if(len != len1) return false;
char [] S1 = A.toCharArray();
char [] S2 = B.toCharArray();
Arrays.sort(S1);
Arrays.sort(S2);
if(Arrays.equals(S1, S2)) return true;
return false;
}
}
方法二:
思路:
仿照 串内无重复字符 解决。
public class Main{
public static void main(String[] args) {
String A = "how are you";
String B = "how Are You";
System.out.println(solve(A,B));
}
public static boolean solve(String A,String B){
int flag[] = new int[128];
if(A.length() != B.length()) return false;
for(int i=0;i<A.length();i++){
flag[A.charAt(i)]++;
}
for(int j=0;j<A.length();j++){
flag[B.charAt(j)]--;
}
for(int i=0;i<128;i++){
if(flag[i] != 0)
return false;
}
return true;
}
}
两串的字符集相同
问题:
判断两字符串的字符集是否相同。实现一个算法,判断两个字符串是否由相同的字符所组成,不用管重复次数。如"abc",“abccc”,这两个字符串的字符集相同,都由abc组成,返回true。
思路:
仿照 串内无重复字符 解决。
public class Main{
public static void main(String[] args) {
String A = "aaabbbcd";
String B = "adcdbsgs";
System.out.println(solve(A,B));
}
public static boolean solve(String A,String B){
int []flag = new int[128];
int []flag1 = new int[128];
for(int i=0;i<A.length();i++){
if(flag[A.charAt(i)] == 0) flag[A.charAt(i)] = 1;
}
for(int j=0;j<B.length();j++){
if(flag1[B.charAt(j)]== 0) flag1[B.charAt(j)] = 1;
}
for(int i=0;i<128;i++){
if(flag[i] != flag1[i])
return false;
}
return true;
}
}
简单压缩
问题:
利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”.若压缩后的字符串没有变短,则返回原来的字符串。
public class Main{
public static void main(String[] args) {
String A = "aaabbbcccc";
System.out.println(solve(A));
}
public static String solve(String A){
StringBuilder sn = new StringBuilder();
int count = 0;
int last = 0;
for(int i=0;i<A.length();i++){
char ch = A.charAt(i);
if(sn.length() == 0) { sn.append(ch); count++;}
else if(ch == last) count++;
else if(ch != last) {sn.append(count).append(ch); count = 1;}
last = ch;
}
if(count >= 1) sn.append(count);
if(A.length() < sn.length()) return A;
return sn.toString();
}
}