程序员面试宝典第一题判断字符串是否相同

题目:

 (编程题)

请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。

给定一个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);
}

以上代码未实际测试过,如有错误,请指出

 
 
 
 
 
 
 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/CarrollTM/p/10516051.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值