(1)实现一个算法,确定一个字符串的所有字符是否全都不同。假使不允许使用额外的数据结构,又该如何处理?
算法:构建一个布尔值的数组,索引值i对应的标记指示该字符串是否含有字母表第i个字符(以ASCII编码表为例,其中包含256个字符)。若这个字符第二次出现,则立刻返回false。
<span style="white-space:pre"> </span>public boolean isDiff(String str)
{
if(str.length() > 256)
return false;
//ascii码有256个字符,初始化boolean默认false
boolean[] char_set = new boolean[256];
if(str != null)
{
for(int i=0; i<str.length(); i++)
{
int index = str.charAt(i);
//存在重复的字符返回false
if(char_set[index])
return false;
char_set[index] = true;
}
}
return true;
}
(2)用C或C++实现void reverse(char* str)函数,即反转一个null结尾的字符串。
算法:处理字符串操作,常见做法是从字符串尾部开始编辑,从后往前反向操作。
首先用一个指针end遍历字符串到尾部,然后首指针和尾指针对应的字符互换。 注意尾部空指针的处理。
void reverse(char* str) {
char temp, *end = str;
if(str)
{
while(*end)
{
++end;
}
//end指针指向字符串尾部的空指针,自减一用来指向最后一个字符。
--end;
while(str < end)
{
temp = *str;
*str++ = *end;
*end-- = temp;
//++str; --end;
}
}
}
(3)给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另外一个字符串。
算法:本题假定区分字符串的大小写并考虑空白情况。即“god ”不是“dog”的重新排列(变位词)。易知当两字符串长度不同时肯定不是变位词。
方法一:排序字符串
方法二:检查两字符串的各字符数是否相同