字符串通配符算法
⑴ 什么是通配符 这道题是什么意思、、请高手解释一下、、
通配符是一种特殊语句,主要有星号(*)和问号(?),用来模糊搜索文件。当查找文件夹时,可以使用它来代替一个或多个真正字符;当不知道真正字符或者懒得输入完整名字时,常常使用通配符代替一个或多个真正的字符。 实际上用“*Not?paOd”可以对应Notpad\MyNotpad【*可以代表任何文字】;Notpad\Notepad【?仅代表单个文字】;Notepad\Notepod【ao代表a与o里二选一】,其余以此类推。
⑵ 判断两个字符串是否匹配,其中字符串中包括通配符*或(串)。*代表0个或多个字符代表一个字符
给你一个用递归算法写的字符串匹配函数,
非常精练,你可以参考一下,希望能看懂。
输入:
s,指向含通配符的匹配字符串,
d,指向要匹配的字符目标
返回值:
1,匹配一致
0,不能匹配
int StrMatch(const char *s,const char *d)
{ for(;*s;s++,d++)
{ if(*s=='*')
{ for(s++;;d++)
{ if(StrMatch(s,d))return 1;
if(*d==0)return 0;
}
}
if(*d==0)return 0;
if(*s!='?'&&*s!=*d)return 0;
}
return !(*d);
}
⑶ 做了个带通配符 查找字符串的题,算法有错误,帮忙看
问题没说清楚。
如果是把y中的问号,用x中的对应单元的字符替代,可以这样写:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
int a,b,c=0,z[100];
char x[100],y[100],m[100];
int i,j,k;
scanf("%s %s", &x[0],&y[0]);
a=strlen(x);
b=strlen(y);
for(j=0;j<b;j++)
{
z[j]= -1;
if (strncmp(&y[0]+j,"?",1) == 0) {
z[j]=j;
strncpy(&y[0]+j, &x[0]+j,1);
};
}
printf("%s ",y);
}
输入:
1234567890 abc?ef?h
输出:
abc4ef7h
如果要截取某一长度,只要让y[长度]这个单元为 "\0" -- 字符串结束符就可以了。
⑷ 用python解一道通配符匹配的算法题
假设输入的字符串为s,匹配串为p,代码如下
classSolution(object):
defisMatch(self,s,p):
"""
:types:str
:typep:str
:rtype:bool
"""
sIndex,pIndex=0,0
sLen=len(s)
pLen=len(p)
sPrevIndex,pPrevIndex=1,pLen
whilesIndex<sLen:
#当两个串对应位置字母可以等价时,各自索引均向后
ifpIndex<pLenand(s[sIndex]==p[pIndex]orp[pIndex]=='?'):
sIndex+=1
pIndex+=1
#当模式串为*时,先以匹配0个的方式暂时匹配
elifpIndex<pLenandp[pIndex]=='*':
sPrevIndex=sIndex+1
pPrevIndex=pIndex
pIndex+=1
#当暂时匹配失败时,以匹配多1个的方式继续匹配
elifpPrevIndex<pLen:
sIndex,pIndex=sPrevIndex,pPrevIndex
#匹配失败
else:
returnFalse
#看模式串剩下的字母是否均为*
foriinrange(pIndex,pLen):
ifp[i]!='*':
returnFalse
returnTrue
⑸ ·代表任意一个字符,*代表任意一串字符,判断两个字符串是否匹配
java代码:
publicstaticvoidmain(String[]args){
System.out.println(isMatch("asdfgvbbnchb","as*bnc.b"));
}
/**
*动态规划法判断普通字符串是否与通配符字符串匹配。
*
*<pre>
*算法思路:
*设s为普通字符串,p为通配符字符串,字符串中字符编号以0起始。
*申请布尔型数组dp[s.length+1][p.length+1]。
*1.dp[0][0]表示s为空串、p为空串时是否匹配,显然为true,dp[0][0]=true。
*2.dp[0][j+1],0=<j<p.length,表示s为空串时,s与p[0..j]是否匹配,
*当dp[0][j]=true且p[j]='*'时,dp[0][j+1]=true。
*如果dp[0][j]=false,即p[0..j-1]已经不能与空串匹配了,显然加上p[j]
*也不能匹配。
*如果p[j]!='*',则p[j]必须与一个字符匹配,而s为空串,显然不能匹配。
*3.dp[i+1][j+1]表示s[0..i]与p[0..j]是否匹配。
*3.1如果p[j]='*',那么可以有两种匹配方式:
*方式1.p[j]与s[i]匹配,s[i]被匹配掉后,还需判断s[0..i-1]是否与
*p[0..j]匹配,故dp[i+1][j+1]=dp[i][j+1]。
*方式2.p[j]不与s[i]匹配,这时还需判断s[0..i]是否与p[0..j-1]匹配,
*故dp[i+1][j+1]=dp[i+1][j]。
*综合两种情况,dp[i+1][j+1]=dp[i][j+1]||dp[i+1][j]。
*3.2如果p[j]='.',则p[j]必须和s[i]匹配,还需判断s[0..i-1]是否与
*p[0..j-1]匹配,故dp[i+1][j+1]=dp[i][j]。
*3.3如果p[j]为其他字符并且与s[i]相同,则p[j]必须和s[i]匹配,还需判断
*s[0..i-1]是否与p[0..j-1]匹配,故dp[i+1][j+1]=dp[i][j]。
*这种情况可以与情况3.2合并。
*最终dp[s.length][p.length]即表示s与p是否匹配。
*</pre>
*
*@params
*普通字符串。
*@paramp
*通配符字符串。
*@return如果普通字符串与通配符字符串匹配则返回true,否则返回false。
*/
publicstaticbooleanisMatch(Strings,Stringp){
boolean[][]dp=newboolean[s.length()+1][p.length()+1];
dp[0][0]=true;
for(intj=0;j<p.length();j++){
if(dp[0][j]&&p.charAt(j)=='*'){
dp[0][j+1]=true;
}
}
for(inti=0;i<s.length();i++){
for(intj=0;j<p.length();j++){
if(p.charAt(j)=='*'){
dp[i+1][j+1]=dp[i][j+1]||dp[i+1][j];
}elseif(p.charAt(j)=='.'||p.charAt(j)==s.charAt(i)){
dp[i+1][j+1]=dp[i][j];
}
}
}
returndp[s.length()][p.length()];
}
⑹ 在Word编辑中,模式匹配查找中能使用的通配符是
在Word编辑中,模式匹配查找中能使用的通配符是:*和?。
模式匹配,数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是模式匹配。
假设P是给定的子串,T是待查找的字符串,要求从T中找出与P相同的所有子串,这个问题成为模式匹配问题。P称为模式,T称为目标。如果T中存在一个或多个模式为P的子串,就给出该子串在T中的位置,称为匹配成功;否则匹配失败。
(6)字符串通配符算法扩展阅读
算法思想:从目标串的的第一个字符起与模式串的第一个字符比较,若相等,则继续对字符进行后续的比较,否则目标串从第二个字符起与模式串的第一个字符重新比较,直至模式串中的每个字符依次和目标串中的一个连续的字符序列相等为止,此时称为匹配成功,否则匹配失败。
若模式子串的长度是m,目标串的长度是n,这时最坏的情况是每遍比较都在最后出现不等,即没变最多比较m次,最多比较n-m+1遍,总的比较次数最多为m(n-m+1),因此朴素的模式匹配算法的时间复杂度为O(mn)。
朴素的模式匹配算法中存在回溯,这影响到匹配算法的效率,因而朴素的模式匹配算法在实际应用中很少采用。在实际应用主要采用无回溯的匹配算法,KMP算法和BM算法均为无回溯的匹配算法。
⑺ 加密后的字符串最后有两个“==”是什么加密算法
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。
1,Base64使用US-ASCII子集的64个字符,即大小写的26个英文字母,0-9,+,/。
2,编码总是基于3个字符,每个字符用8位二进制表示,因此一共24位,再分为4四组,每组6位,表示一个Base64的值。
3,Base64值为0就是A,为27的就是b。这样,每3个字符产生4位的Base64字符。如果被加密的字符串每3个一组,还剩1或2个字符,使用特殊字符"="补齐Base64的4字。
(7)字符串通配符算法扩展阅读:
应用
Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的一个标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。
在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换。
因为ANSI SQL中已将“%”号用作通配符。
为解决此问题,可采用一种用于URL的改进Base64编码,它不仅在末尾去掉填充的'='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”。
这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
另有一种用于正则表达式的改进Base64变种,它将“+”和“/”改成了“!”和“-”,因为“+”,“/”以及前面在IRCu中用到的“[”和“]”在正则表达式中都可能具有特殊含义。
此外还有一些变种,它们将“+/”改为“_-”或“._”(用作编程语言中的标识符名称)或“.-”(用于XML中的Nmtoken)甚至“_:”(用于XML中的Name)。