怎样迅速匹配兄弟字符串

假设两个字符串的字符一样,可是顺序不一样,被觉得是兄弟字符串。问怎样在迅速匹配兄弟字符串(如,bad和adb就是兄弟字符串)。思路:推断各自素数乘积是否相等。

方法一:

1、推断两个字符串的长度是否一样。

2、每一个字符串按字符排序。如acb排序之后是abc,假设是兄弟字符串的话,排序之后是一样的。

方法二:

给26个字符依次赋予质数。质数是比較特殊的一堆数字,它们仅仅能被1和本身整除。

给a赋值2、给b赋值3、给c赋值5、给d赋值7、给e赋值11、给f赋值13 等等……

加法:两个字符串中的全部字符都赋值了,接着让它们各自相加。假设两个字符串得出的结果是一样的,那它们是兄弟字符串。

可是,b+f=3+13=16。c+e=5+11=16,所以有误。

乘法:两个字符串中的全部字符让它们各自相乘。方法是对的,可是会溢出。所以要大整数处理了。

用平方和或者立方和:考虑平方和会不会解决加法有误。乘法溢出:b*b+f*f=3*3+13*13=178;c*c+e*e=5*5+11*11=146;

方法三:

用hashmap能够。以字母为key。出现的次数为value,次数一样即为同样的。

方法三代码

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;  

int main()
{
	int hash1[256],hash2[256],i,len1,len2;
	char str1[100],str2[100]; 

	printf("请输入2个字符串:(0结束)\n");
	while(1)
	{
		//输入
		scanf("%s",str1);
		if(!strcmp(str1,"0")) break;
		scanf("%s",str2);

		//比較长度
		len1=strlen(str1);
		len2=strlen(str2);
		if(len1!=len2)
		{
			printf("%s,%s,二者不是兄弟字符串\n",str1,str2);
			continue;
		}

		//字符是否同样
		memset(hash1,0,sizeof(hash1));
		memset(hash2,0,sizeof(hash2));
		for(i=0;i<len1;i++)
		{
			hash1[str1[i]]++;
			hash2[str2[i]]++;
		}
		for(i=0;i<255;i++)
		{
			if(hash1[i]!=hash2[i])//不同
				break;
		}
		if(i==255)
			printf("%s,%s,二者是兄弟字符串\n",str1,str2);
		else
			printf("%s,%s,二者不是兄弟字符串\n",str1,str2);
	}
}
/*
bad abd
abcd abc
aabbccdd abcdabcd
abcdabc aabbccc
aaa bbb
ababa babab
ababa aabba
0
*/
时间: 2024-08-29 08:31:46

怎样迅速匹配兄弟字符串的相关文章

如何迅速匹配兄弟字符串

如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串,问如何在迅速匹配兄弟字符串(如,bad和adb就是兄弟字符串).思路:判断各自素数乘积是否相等. 方法一: 1.判断两个字符串的长度是否一样. 2.每个字符串按字符排序,如acb排序之后是abc,如果是兄弟字符串的话,排序之后是一样的. 方法二: 给26个字符依次赋予质数.质数是比较特殊的一堆数字,它们只能被1和本身整除. 给a赋值2.给b赋值3.给c赋值5.给d赋值7.给e赋值11.给f赋值13 等等-- 加法:两个字符串中的所有字

兄弟字符串(转)

1 /* 2 如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串, 3 问如何在迅速匹配兄弟字符串(如,bad和adb就是兄弟字符串). 4 */ 5 #include <iostream> 6 using namespace std; 7 8 int isBroStr(char *str1, char *str2) 9 { 10 int a[60] = {0}; 11 int i, strLen; 12 13 if (!str1 && !str2) 14 retur

寻找兄弟字符串

/* 如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串, 问如何在迅速匹配兄弟字符串(如,bad和adb就是兄弟字符串). */ #include <iostream> #include<cstring> using namespace std; int isBroStr(char *str1, char *str2) { int a[26 * 2] = {0}; int i, strLen; if (!str1 && !str2) return 1;

括号匹配(字符串)

问题描述:检查字符串表达式中的括号是否匹配:左括号数目同有括号数目不相等即为不匹配:去除多余的左括号或者右括号,优先保留先出现的括号:匹配后去除无效的括号:如:((表达式)) 应为(表达式):只考虑小括号,不考虑先出现右括号的情况:要求实现函数: (字符串最长长度为60:表达式正确性不需要考虑)void Bracket(char* src, char* dst);如果匹配则通过dst 输出原串:如果不匹配则根据要求去处多于括号后通过dst 输出匹配后的串示例输入:12+(345*25-34) 输

假如正则从来没来过,我们该如何去匹配一个字符串?

正则表达式其实挺难的,对于新手来说就好比一本天书.很多高端大气上档次的教程啊教材啊博客啊一般都是先列出框框条条,再来细讲,先元字符再量词再分组再反向引用.我估计是国人都受到了国外教材的影响,因为这些东西是他们整出来的.对于他们来说思路是很清晰的.老手还好,勉强能吃透.新手你没个几十遍的功夫,门都找不到在哪里.光那些规则,字母意思啊就够你喝一壶的了,你是忘了看,看了忘.(ps:本文针对javascript正则) 假如我们根本就不知道有正则这玩意儿存在,要去匹配一个字母串我们应该怎么做了?让我们也做

20170502 匹配单个字符串

为了方便爬虫,最近学习了正则表达式,将学习的过程记录如下: 一.正则表达式的概念: 1.使用单个字符串来描述匹配一系列符合某个句子语法规则的字符串 2.是对字符串操作的一种逻辑公式 3.应用来处理文本和数据 4.表达过程:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功,否则匹配失败 二.匹配单个字符串 import re ma = re.match(r'a','a')#匹配a字符print(ma)print(ma.group()) mb = re.match(r'a','b

找出输入中的一个或多个匹配的字符串

//找出输入中的一个或多个匹配的字符串. 这里使用的是Mather类的find方法,来查找匹配的内容 package match; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxE

C/C++用strncpy()与strstr()分割与匹配查找字符串

最近做题遇到分割与匹配字符串的题目(hdu5311),看来别人的代码,才知道有strncpy()和strstr()函数,于是搜集了一点资料,记录一下基本用法. 一.strncpy() char * strncpy ( char * destination, const char * source, size_t num ); strncpy() 在 <string.h>头文件中(C++中为<cstring>),拷贝原字符串S中长度为num的部分至目标字符串D中. #include

Long型070000L前面0去掉比较大小,token,mysql innodb,properties,switch匹配空字符串对象

public class TestJava { //定义获取资源文件 private static final ResourceBundle bundle = initBundle(); private static ResourceBundle initBundle(){ return ResourceBundle.getBundle("conf/chinapay", Locale.CHINA); } //键值对 private final static String MERID_U