题目:
(编程题)
请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。
给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。
测试样例:
"aeiou"返回:True"BarackObama"返回:False
请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。
给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。
测试样例:
"aeiou"返回:True"BarackObama"返回:False
解析:首先需要注意的是,若全部不相同,该字符串最多只有257位,因为为ascii字符
方法1:遍历:双层循环判断可得,按道理为时间复杂度为n2,但其实最多只要判断前257位,所以时间复杂度为o(1)
方法2:排序:首先将全部排序,时间复杂度o(nlogn)快排,遍历一遍来判断,时间复杂度为O(n),和方法一一样,只要判断前257位
方法3:哈希法:对于只要进行查询操作的题目,哈希无疑是一个非常好的选择,时间复杂度为O(1),但这类似于时间换空间,开辟n的数组,此题目要求不能开辟新的空间,所以此方法不适合该题目
方法4:
parition方法:
该方法类似于快速排序,但是是
边排序边判断是否重复,使用left,right控制两边,pos为中间元素,时间复杂度为O(nlogn)
快速排序理解请看此处:
https://blog.csdn.net/code_AC/article/details/74158681
此下为代码:
bool quick_sort(string &str, int low, int high) { int left = low, right = high; char pos = str[left]; if (low >= high) return true; while (left < right) { while (pos <str[right] && left < right) { right--; } str[left] = str[right]; while (left<right&&pos>str[left]) { left++; } str[right] = str[left]; } str[left] = pos;//两种情况都是最终可以变成这样 //此时left和right都在一个位置 //判断该点是否重复(相等的情况) if (left > low&&str[left] == str[left - 1]) { return false; } if (right < high&&str[right] == str[right + 1]) { return false; } return quick_sort(str,low, left - 1) &&quick_sort(str, left+1,high); } bool check_difference(string str) { int length = str.size(); return quick_sort(str, 0, length - 1); }
以上代码未实际测试过,如有错误,请指出