字符串对比
2014-03-18 19:55
218 查看
Problem 119: 字符串对比
Time Limit:1 Ms| Memory Limit:64 MBDifficulty:1
Description
给定两个仅由大写字母或小写字母组成的字符串(长度介于1到100之间),它们之间的关系是以下4中情况之一: 1:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比如 Beijing 和 Beijing
2:两个字符串长度相等,相应位置上的字符仅在不区分大小写的前提下才能达到完全一致(也就是说,它并不满足情况1)。比如 beijing 和 BEIjing
3:两个字符串长度相等,但是即使是不区分大小写也不能使这两个字符串一致。比如 Beijing 和 Nanjing
4:两个字符串长度不等。比如 Beijing 和 Hebei
注意,第一行字符串中可以使用多个*代表0个或者1个任意字符进行匹配
当符合上述条件中的两种或者两种情况以上时,优先输出较小的数字,比如a*b和 adz同时满足3,4两个条件
即当*代表0个字符时,满足4,而代表任意一个字符时,满足条3,此时应该输出3.
编程判断输入的两个字符串之间的关系属于这四类中的哪一类,给出所属的类的编号。
Input
包括两行,每行都是一个字符串(长度小于100)
Output
仅有一个数字,表明这两个字符串的关系编号
Sample Input
样例输入BEIjing
beiJing
样例输入
na*jing
beiJing
样例输入
be*ji*g
beijing
Sample Output
样例输出2
样例输出
3
样例输出
1
Source
代码:#include<stdio.h> #include<string.h> void dfs(int p, int q, int la, int lb); char a[100],b[100]; int lena, lenb, count = 0, num;//count用来记录a中*号的个数; int f, f2, f3, ans = 65535;//f2存储大写字母的个数, f3存的是对应位置字母不同的个数; int main() { int i; scanf("%s%s", a, b); lena = strlen(a); lenb = strlen(b); for(i = 0; i < lena; i++) { if(a[i] == '*') { count++; } } num = lena - count; if(num > lenb || lena < lenb)//a的字母长度大于b的或者a的长度小于b的长度; { printf("4\n"); } else { dfs(0, 0,0,0); printf("%d\n", ans); } return 0; } void dfs(int p, int q, int la, int lb) { int t; if(f) { return; } if(p == lena)//la等于lb说明a和b的长度相等; { if(la == lb) { if(f2 && f3 == 0) { t = 2; if(t < ans) { ans = t; f = 1; } return; } else if(f3)// { t = 3;//还有。。。可能是舍弃*号以后导致的不同; if(t < ans) { ans = t; } } else { ans = 1; f = 1; return; } } else { t = 4; if(t < ans) { ans = t; } } } else { if(a[p] == '*') { if(q == lenb)//b已经是尽头了,那么如果是*号都不选了; { dfs(p+1,q,la,lb); } else { dfs(p + 1, q + 1, la+1, lb + 1);//*号是1,p,q,同时向下一位进; dfs(p + 1, q, la + 0, lb + 0);//*号代表0; } } else if(q != lenb) { if(a[p] + 32 == b[q] || a[p] == b[q] + 32)//a[p] 与b[q] 是大小写关系; { f2++; dfs(p + 1,q + 1, la + 1, lb + 1); f2--; } else if(a[p] != b[q]) { // printf("yy\n"); f3++;//f3有值则说明有对应位置不同的字母; dfs(p + 1, q + 1, la + 1, lb + 1); f3--; } else if(a[p] == b[q])// a与b 相等的情况; { //printf("io\n"); dfs(p + 1, q + 1, la + 1, lb + 1);//同时下标下移并且匹配的长度加1; } } else if(q == lenb) { f3++; dfs(p + 1, q, la + 1, lb); f3--; } } }
代2:
#include<stdio.h> #include<string.h> #include<ctype.h> int len1, len2, ans; char s1[105], s2[105]; void dfs(int i, int j, int temp); int main(){ int count, i; scanf("%s %s", s1, s2); len1 = strlen(s1); len2 = strlen(s2); count = 0; for(i = 0; i < len1; i++){ if(s1[i] == '*') count++; } if(len1 < len2 || len1 - count > len2){ printf("4\n"); } else{ ans = 4; dfs(0, 0, 1); printf("%d\n", ans); } return 0; } void dfs(int i, int j, int temp){ if(i == len1){ if(ans > temp) ans = temp; return ; } if(s1[i] == '*'){ dfs(i + 1, j, temp);//不选*号; s1[i] = s2[j];//选*号,把s1[i]的字母变为和s2[j]相同; dfs(i + 1, j + 1, temp); } else{ if(s1[i] == s2[j]){ dfs(i + 1, j + 1, temp); } else{ if(toupper(s1[i]) == toupper(s2[j])){//toupper(s1[i])函数大小写转换; if(temp < 2){ temp = 2; } dfs(i + 1, j + 1, temp); } else{ if(temp < 3) temp = 3; dfs(i + 1, j + 1, temp); } } } }
相关文章推荐
- JAVA 蓝桥杯基础练习 字符串对比
- 使用xmlUnit对XML字符串对比的一些技巧
- 生成大量随机字符串不同实现方式的效率对比
- 字符串对比
- BASIC-15 VIP试题 字符串对比
- 【原创】 POSTGRESQL 与MYSQL 实现分割字符串的方法对比
- 表值参数与分割字符串表值函数效率对比
- 传入一个时间戳,传入后,会与本地的时间进行对比,得到返回的字符串,有一小时前,一天前,等等
- 字符串对比
- 判断字符串类型以及对比
- 蓝桥-BASIC-15 字符串对比
- ACM:蓝桥杯:字符串对比
- 蓝桥杯 BASIC-15 基础练习 字符串对比
- 字符串Hash函数对比(By:icefireelf)
- c/c++字符串定义及使用的对比
- jquery 字符串对比 以及each遍历
- 安卓中字符串对比(相等)的坑
- 判断字符串为空方法性能对比实验
- 蓝桥杯:字符串对比
- 基础练习 字符串对比