博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1.1确定字符各异
阅读量:5098 次
发布时间:2019-06-13

本文共 1840 字,大约阅读时间需要 6 分钟。

题目描述

请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。
 
给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。
测试样例:
"aeiou"
返回:True
"BarackObama"
返回:False
 

解法

1)
哈希法,首先char类型判断重复,用hash数组最方便,只需要256个bool类型即可,O(n)的时间(根据
抽屉原理,
其实只要判断前257个就行了,T(n)=O(1))。但是,如果题目要求不能使用额外的存储结构,则该方法KO掉。
2)
遍历,那么只能用两层for循环遍历,时间复杂度为O(n*n),但是根据抽屉原理,没必要遍历到N,只需要遍历到前257就够了,如果N<257就遍历到N,所以时间复杂度其实为O(1)!!!
3)
排序,既然题目要求不能使用额外空间,而参数列表没有const或引用,那么就可以对字符串排序,然后再判断,需要O(nlogn)排序,然后再遍历一遍O(n)。其实也没必要全都排序,只需前257个,同抽屉原理。
4)
Parition 基于快速排序的partition,可以
边排序边找重复,也即是每次partition之后,判断中间key元素与两边元素是否相同,相同则返回false,不同再进行下一轮partition.时间复杂度也是O(nlongn),但要比排序速度快。
 
1 class Different 2 { 3  4     bool quick_check(string &str, int low, int high) 5     { 6         int first = low, last = high; 7         char key = str[first]; 8  9         if(low >= high)10         {11             return true;12         }13 14         while(first < last)15         {16             while(first < last && str[last] >= key)17             {18                 last--;19             }20 21             str[first] = str[last];22             while(first < last && str[first] <= key)23             {24                 first++;25             }26             str[last] = str[first];27         }28 29         str[first] = key;30         if(first > low && str[first] == str[first - 1])31         {32             return false;33         }34 35         if(first < high && str[first] == str[first + 1])36         {37             return false;38         }39         return quick_check(str, low, first - 1) && quick_check(str, first + 1, high);40     }41 42 public:43     bool checkDifferent(string iniString)44     {45         // write code here46         return quick_check(iniString, 0, iniString.size() - 1);47 48     }49 };

 

参考文献: <>

 

 

转载于:https://www.cnblogs.com/gxcdream/p/4912277.html

你可能感兴趣的文章
[你必须知道的.NET]第二十一回:认识全面的null
查看>>
Java语言概述
查看>>
关于BOM知识的整理
查看>>
使用word发布博客
查看>>
面向对象的小demo
查看>>
微服务之初了解(一)
查看>>
GDOI DAY1游记
查看>>
收集WebDriver的执行命令和参数信息
查看>>
数据结构与算法(三)-线性表之静态链表
查看>>
mac下的mysql报错:ERROR 1045(28000)和ERROR 2002 (HY000)的解决办法
查看>>
Hmailserver搭建邮件服务器
查看>>
django之多表查询-2
查看>>
快速幂
查看>>
改善C#公共程序类库质量的10种方法
查看>>
AIO 开始不定时的抛异常: java.io.IOException: 指定的网络名不再可用
查看>>
MyBaits动态sql语句
查看>>
HDU4405(期望DP)
查看>>
拉格朗日乘子法 那些年学过的高数
查看>>
vs code 的便捷使用
查看>>
Spring MVC @ResponseBody返回中文字符串乱码问题
查看>>