算法题随笔

1.挑选字母(来源于华为OD笔试)
有两个字符串a,b。从a中挑选出字母组成b。其中b不会重复
0<a.length()<100
0<b.length()<10
要求:
每个位置只能挑选一次
每个字母的相对顺序不能改变
求:
能组成多少次?
例:a=“abc”;
b=“ac”;
返回1
例:a=“aabc”;
b=“ac”;
返回2

解题思路:
记录b中每个字符在当前循环中对应的a中的下标。一轮遍历结束后,找到b的上一个字符遍历到哪个位置,接着往下遍历。
代码:
private static int od(String a, String b) {
char[] charA = a.toCharArray();
char[] charB = b.toCharArray();
// 存放b中每个字符在当前循环中,对应在a中的位置
int[] indexBinA = new int[10];
int indexa = 0;
int indexb = 0;
int count = 0;
while (indexa < a.length() && indexb < b.length()) {
if (charA[indexa] == charB[indexb]) {
// 在a中找到b的字符,存下这个字符对应在a中的位置,后续需从这个位置后面继续遍历
indexBinA[indexb] = indexa;
if (indexb == (b.length() - 1)) {
// 当前遍历字符是b中的最后一个字符,说明已经拼成了完整的字符串
count++;
if (indexa == (a.length() - 1)) {
// a是最后一个字符了
// 找到b的前一个字符串,a从记录的位置+1开始遍历
indexb–;
indexa = indexBinA[indexb] + 1;
} else {
// 继续遍历a,看后面是否还有符合要求的字符
indexa++;
}
} else if (indexa == (a.length() - 1)) {
// a是最后一个字符了
if (indexb == 0) {
// b还是第一个字符,说明一个都没有匹配到
break;
} else {
// 找到b的前一个字符串,a从记录的位置+1开始遍历
indexb–;
indexa = indexBinA[indexb] + 1;
}
} else {
indexa++;
indexb++;
}
} else {
if (indexa == (a.length() - 1)) {
if (indexb == 0) {
break;
} else {
// 找到b的前一个字符串,a从记录的位置+1开始遍历
indexb–;
indexa = indexBinA[indexb] + 1;
}
} else {
indexa++;
}
}
}
return count;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值