小菜找实习——阿里3月27日场笔试第一题

本文介绍了阿里笔试中的一道字符串题目,要求通过特定操作将字符串S转换为T。作者最初尝试了错误的解法,后来发现贪心策略能有效解决。在总结中,作者强调了简化思考和充分实践的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

小强现在可以将任何一个字符串的一位以O(1)的代价移到末尾

现在给定一个字符串S,字符串T。求问最少用几次可以将S以上述的方法移动变成T

如果不能组成 就返回-1

样例输入

acdk

ckad

样例输出

2

将a移到最后变成cdka,将d到最后变成ckad

 

一开始去想求 公众最长子序列,然后以字符串的长度减去这个序列长度,差点把自己写死,最后也没跑过,那时候心态有点小崩。

(而且这次笔试最后调用函数后忘记去System.out.println()了,然后自动提交都没改好,反思:写代码一定要写把模板接口给弄好)!

 

(后来交完卷和大家一起讨论,实际上这个题可能就是下面这么简单的思路)

思路:用贪心,t串每一个字符和s串比较,相同的位置s串打个记号,下一轮从记号处往后扫描,直到s串结束,最后总长度-t串已经扫描的长度 就是要求的结果。

不能组成的情况一定是S和T字符串中a-z中某个字符数目不一样,我们可以考虑用一个数组去检验

 

private static int  compute( String s1,String s2){
        int m=s1.length(),n=s2.length();
        if (m!=n) return -1;  //边界处理
        int[]arr1 = new int[26];
        int[]arr2 = new int[26];
       for(int i=0;i<m;i++){
           arr1[s1.charAt(i)-'a']++;
           arr2[s2.charAt(i)-'a']++;
       }
        for(int i=0;
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值