码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-03-12 13:55:41      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:asc   oba   col   bsp   面试   details   位置   哈希法   空间   

题目:

 (编程题)

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

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

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

 
 
 
 
 
 
 
 
 
 
 
 
 

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

标签:asc   oba   col   bsp   面试   details   位置   哈希法   空间   

原文地址:https://www.cnblogs.com/CarrollTM/p/10516051.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!