快速找出在字符串A中而不在字符串B中的字符
来源:互联网 发布:网络角色游戏排行榜 编辑:程序博客网 时间:2024/04/24 06:12
问题是这样的,假设连个线性表La和Lb分别表示两个集合A和B(即线性表中的数据元素即为集合中的成员),现要求一个新的集合A = A U B.这就要求对线性表作如下的操作;扩大线性表La,将存在于线性表Lb中而不存在于La中的数据元素插入到线性表La中去。只要从线性表Lb中依次取得每个数据元素,并依值在线性表La中进行查防,如不存在,则插入之。
方法一:
void union(List &La , List &Lb){ //将所有在线性表Lb中但不在La中的数据元素插入到La中 La_len = ListLength(La); Lb_len = ListLength(Lb); for (i = 1; i <= Lb_len; i++) { GetElem(Lb, i ,e); //Lb中第i个数据赋给e if (!LocateElem(La, e, equal)) ListInsert(La, ++La_len,e); //La中不存在和e相同的数据元素,则插入之 }}LocateElem()通过遍历线性表来匹配e,则所花费的时间为O(ListLength(La))。而遍历线性表Lb所花费的的时间为O(ListLength(Lb)).故,此算法的时间复杂度为:
O(ListLength(La) x ListLength(Lb)). 平均时间复杂度为:O(n ^2).由此我们可以看出这种方法的效率不是很高!!
方法二:
通过哈希表将线性表La中的字符记录在一个标志数组flag_tab中,然后,用同样的哈希函数,求出Lb中key所对应的value值,如果此value在也在flag_tab中找到,说明此字符也在La中,否则就不在La中。具体代码如下:
/* * ===================================================================================== * * Filename: stringfind.c * * Description: 字符串查找,找出在字符串A中而不在字符串B中的字符 * * Version: 1.0 * Created: 2014年07月22日 15时59分58秒 * Revision: none * Compiler: gcc * CopyRight: open , free , share * Author: yexingkong(zhangbaoqing) * Email: abqyexingkong@gmail.com * Company: Xi'an University of post and Telecommunications * * ===================================================================================== */#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXTABSIZE100/*字符串的最大长度 *//* -------------------------------------------------------------------*//** * @Synopsis= 找出在string_tab_b中而不在string_tab_a中的字符 (字符可为ascii 33 ~ 126的字符) * * @Param= string_table_a 要查寻的字符串表a * @Param= string_table_b 要查寻的字符串表b * * @Returns=返回0,成功, 否则失败 *//* ----------------------------------------------------------------------------*/int findDiffCharWithHash(char *string_table_a, char *string_table_b){int string_len_a = 0, string_len_b = 0;int i = 0 ;char *flag_tab = NULL; //指向string_tab_a字符存在标志数组int hash_key = 0;string_len_a = strlen(string_table_a); //字符数组a的长度string_len_b = strlen(string_table_b); //字符数组b的长度flag_tab = (char *)malloc(MAXTABSIZE*sizeof(char)); //标志数组memset(flag_tab,'n',MAXTABSIZE*sizeof(char)); //数组赋值为‘n’for (i = 0 ; i < string_len_a; i++){hash_key = string_table_a[i] - 33;//哈希直接定址法if ('n' == flag_tab[hash_key]){ flag_tab[hash_key] = 'y'; }}printf("\n");printf("The characters in the \"%s\" ,but not in the \"%s\" are: \n",string_table_b,string_table_a );for (i = 0 ; i < string_len_b; i++){hash_key = string_table_b[i] - 33;if ('n' == flag_tab[hash_key]) //如果字符string_table_b[i]不在string_table_a中,则打印出来{printf("%c ",string_table_b[i]);}}printf("\n");free(flag_tab);return 0;}int main(int argc, char *argv[]){char string_tab_a[MAXTABSIZE], string_tab_b[MAXTABSIZE];printf("Please input the first string\n");scanf("%s",string_tab_a);printf("Please input the second string\n");scanf("%s",string_tab_b);findDiffCharWithHash(string_tab_a,string_tab_b);return EXIT_SUCCESS;}
可以看出,此算法所花费的时间就在findDiffCharWithHash( )函数中的两个for循环里,故此算法的时间复杂度就为:
O(string_len_a + string_len_b).平均时间复杂度 为O(n)。所以方法二的效率比方法一更高点!!
0 0
- 快速找出在字符串A中而不在字符串B中的字符
- (本程序功能:字符串A中找出包含字符串B中所有字符的位置并输出) 在使用全局变量m的时候,输出错误的结果,而用下面局部变量M就没问题。
- 华为笔试—在字符串A中删除字符串B中的全部字符
- 找出A字符串中 B字符串没有的字符(运用java api)
- 两个字符串A,B,求B在A中首次出现的位置,如果B不在A中返回-1.
- 两个数组A、B,求在A中出现而不在B中的数(求不相交集)
- 字符串查找--B中是否有元素不在A中
- js中,判断一个字符在不在一个字符串中
- 两个字符串A、B,从A中剔除存在于B中的字符
- 快速找出两个字符串中所有相同的字符
- 将字符串B插入字符串A中最大字符前面
- 从字符串A中删除字符串B的所有字符
- java 找出一个字符在 一个字符串中的位置
- 找出给定字符在字符串中出现的次数
- 在一个字符串中找出第一次重复出现的字符
- 在字符串中找出第一个不重复的字符
- 找出字符在字符串中出现的次数
- 短字符串a中的字母是否都包含在长字符串b中
- Ubuntu svn 更新到最近版本1.8
- velocity
- linux 压缩文件的命令总结
- Myeclipse11 tomcat console 中文乱码解决
- 空格处理
- 快速找出在字符串A中而不在字符串B中的字符
- Web开发必知的八种隔离级别
- 字符统计&大数乘法&数组排序
- Linux 函数
- hdu 1789 Doing Homework again (贪心)
- vector+map
- 介绍 Java 自带的线程池(1)
- UILabel.text赋值报错,[NCFNumber length] ,unrecognized selector sent to instance
- 为什么要选择购买蛋卷机