title :字符串操作
// 字符反转的方法
private void swap(char[] c, int front, int end) {
if (front > end || end >= c.length) {
return;
}
while (front < end) {
char tmp = c[front];
c[front] = c[end];
c[end] = tmp;
front++;
end--;
}
}
// 判断字符串是否由相同的字符组成
public boolean compareStr(String str1, String str2) {
byte[] bs1 = str1.getBytes();
byte[] bs2 = str2.getBytes();
Arrays.sort(bs1);
Arrays.sort(bs2);
str1 = new String(bs1);
str2 = new String(bs2);
if (str1.equals(str2)) {
return true;
} else {
return false;
}
}
删除重复字符
public String removeDuplicate2(String str) {
char[] cs = str.toCharArray();
int n = cs.length;
int count[] = new int[256];
for (int i = 0; i < cs.length; i++) {
if (count[cs[i]] != 0)
cs[i] = '\0';
count[cs[i]]++;
}
int be = 0;
for (int i = 0; i < n; i++) {
if (cs[i] != '\0')
cs[be++] = cs[i];
}
return new String(cs, 0, be);
}
public static void printStr(String test,Integer ptr)
{
if(ptr<=test.length())
{
char[] chars = test.toCharArray();
for(int i=ptr;i<chars.length;i++)
{
char temp = chars[i];
chars[i]=chars[ptr];
chars[ptr]=temp;
resultSet.add(new String(chars));
printStr(new String(chars),ptr+1);
}
}
}
最长不含重复字符的子字符串
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只还有’a’~’z’的字符
提到回文串,自然要利用回文串的特点,想到将源字符串逆转后,“回文串”(不一定连续)相当于顺序没变
求原字符串和其反串的最大公共子序列(不是子串,因为可以不连续)的长度(使用动态规划很容易求得),然后用原字符串的长度减去这个最大公共子串的长度就得到了最小编辑长度。
int maxLen(string s1, string s2){
int length1 = s1.size();
int length2 = s2.size();
for (int i = 0; i < length1; ++i)
MaxLen[i][0] = 0;
for (int i = 0; i < length2; ++i)
MaxLen[0][i] = 0;
for (int i = 1; i <= length1; ++i)
{
for (int j = 1; j <= length2; ++j)
{
if (s1[i-1] == s2[j-1]){
MaxLen[i][j] = MaxLen[i-1][j - 1] + 1;
}
else
{
MaxLen[i][j] = max(MaxLen[i - 1][j], MaxLen[i][j - 1]);
}
}
}
return MaxLen[length1][length2];
}
int main(){
string s;
while (cin >> s){
int length = s.size();
if (length == 1){
cout << 1 << endl;
continue;
}
//利用回文串的特点
string s2 = s;
reverse(s2.begin(),s2.end());
int max_length = maxLen(s, s2);
cout << length - max_length << endl;
}
return 0;
}
实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
我的解题思路:
先将字符串转化成字符数组;
对其进行排序,再通过for循环进行判断,排序后的字符数组如果前一位与后一位相同,则输出“false”,否则输出“true”。
由于题目没有明确说明,根据示例我判断字符串中出现的字符应该在[‘a’,’z’]之间,实践证明确实如此。基于这个前提,使用bool数组的做法是定义一个长度为26的初始值全为0 bool数组,逐个字符遍历astr,如果bool数组中对应的下标(’a’->0, …, ‘z’->25)的值为1则重复出现,返回false,否则设置对应下标值为1。