判断一个字符串的所有字符是否都在另一个字符串中

网上流传了一个故事,说是在google面试的故事,故事中说最后一道面试题就是假设有两个字符串,一个长一些(字符串1),一个短一些(字符串2),如何判断这个短字符串中的每个字符是否都在这个长字符串中。假设每个字符串都是由26个小写字母组成的。

最后这个大牛提到了用一个素数代表一个字母,把字符串1的字母的积(当然会很大)算出来,然后除以字符串2的每个字符代表的素数。如果每个字符代表的素数都能被整除,说明字符串2中的每个字符都在字符串1中。时间复杂度为O(n+m)

这确实是一个巧妙的方法,不过实现起来却不是很容易。这里针对这个特殊的要求,可以用位图或者hash的思路来解决。

无论是字符串1还是字符串2,都是由【a-z】字母组成的,所以最多只有26个字母,所以只要一个整数(32位)就可以表示字符串所表示的字母,假设这个字母出现,则对应的位置1,那么就算26个字母都出现了,也只需要26位置1.则该思路的c++实现代码如下:

bool is_contained(const char* str1,const char* str2)
{
        int strmap = 0;
        const char * pstr = str1;
        while(*pstr != '\0')
        {
                strmap |= ( 1 << (*pstr - 'a'));
                pstr++;
        }
        pstr = str2;
        bool iscontained = true;
        while(*pstr != '\0')
        {
                if((strmap & (1 << (*pstr - 'a')))  == 0)
                {
                        iscontained = false;
                        break;
                }

                pstr++;
        }
        return iscontained;

}
时间: 2024-10-10 06:48:52

判断一个字符串的所有字符是否都在另一个字符串中的相关文章

下列函数的功能是统计并返回形参指针S所指向的字符串所含字符‘A’的个数。

下列函数的功能是统计并返回形参指针S所指向的字符串所含字符‘A’的个数.试完成程序,写出应填写在程序空框中的代码. int counts(char *s) int n: for( n=0:. : s++) return n: 为统计字符指针s所指字符串包含的某字符的出现次数,必须用一个循环顺序考察整个字符串.由从指针s所指字符串的首字符开始,每考察一个字符后,指针s后移一个字符位置,考察循环直至字符率结束终止.所以填写在空框中的正确代码可写成*S!=‘\ 0’.由于字符串束符‘\ 0’的代码为

判断一个字符串通过变化字符的位置,是否可以组成回文

解法就是判断下字符串中是否有某些字符是奇数个,如果这种字符的个数大于1,说明无法组成回文:小于或等于1可以组成回文. 其中用了strlen(),放到for循环里面容易导致程序运行效率下降,比如输入的字符串很大 10^5个字符时 for(int i=0; i<strlen(string); i++)会导致程序运行很慢.改用: int length = strlen(string); for(int i=0; i<length; i++) 可以很大程度提升效率. #include <stdi

js判断输入字符串长度(汉字算两个字符,字母数字算一个):例如 要求输入12的字,24个字节

<html> <head> <title>js判断输入字符串长度(汉字算两个字符,字母数字算一个)</title> <style type="text/css"> .pbt { margin-bottom: 10px; } .ie6 .pbt .ftid a, .ie7 .pbt .ftid a { margin-top: 1px; } .cl:after { clear: both; content: ".&quo

【LintCode】判断一个字符串是否包含另一个字符串的所有字符

问题描述: 比较两个字符串A和B,确定A中是否包含B中所有的字符.字符串A和B中的字符都是 大写字母. 样例 给出 A = "ABCD" B = "ACD",返回 true 给出 A = "ABCD" B = "AABC", 返回 false 注意事项 在 A 中出现的 B 字符串里的字符不需要连续或者有序. 问题分析: 实质上利用的是哈希表的思想.只有大写字母,一共26个,遍历A的时候,往里面压,遍历B的时候,往外边弹,如果

判断一个字符串,记录字符出现的次数

// 默认一个字符串 String str = "我爱你中国,我爱你故乡"; // 声明一个数组 String[] strArray = new String[100]; // 声明一个变量计数 int count = 0; for (int i = 0; i < str.length(); i++) { // 截取一个字符,存到数组中 strArray[i] = str.substring(i, i + 1); if (strArray[i] != null) { if (st

【字符串】 - 判断是否包含相应的字符 - 截取某一部分字符

**********判断是否包含相应的字符************************************ NSSting *str = @"jack"; NSSring *mStr = @"a"; if ([str rangeOfString: mStr].location != NSNotFound) { NSLog(@"字符串包含a"); } //rangeOfString 前面的参数是要被搜索的字符串,后面的是要搜索的字符    

5.13 添加最少字符使字符串整体都是回文字符串

[题目]: 给定一个字符串str,如果可以在str的任意位置添加字符,请返回在添加字符最少的情况下,让str整体都是回文字符串的一种结果 举例: str="ABA",str本身就是回文串,不需要添加字符,所以返回"ABA" str="AB",可以在'A'之前添加'B',使str整体都是回文串,故可以返回"BAB",也可以在'B'之后添加'A',使str整体都是回文串,故也可以返回"ABA",总之,只要添加的

JAVA----编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符

package com.pb.demo.packclass.demo1; import java.util.HashSet; /** * 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符 例如: 原始字符串是"abc",打印得到下列所有组合情况 "a" "b" "c" "ab" "bc" "ca" "ba" "cb"

(不包括\0) 编写一个int string_len(char *s), 返回字符串s的字符长度

#include <stdio.h> /* (不包括\0) 编写一个int string_len(char *s), 返回字符串s的字符长度 */ int string_len(char *s); int main() { //char *name = "itcast"; // 男 \u434\u4343\u434 int size = string_len("tre777"); printf("%d\n", size); retur