下列字符串表示方法下面能正确进行字符串的是( )。 A)‘你的水平好高啊!’ B)’你的

&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
Google OA题目:给出使得字符串B成为字符串A重复自己构成的字
摘要:实现如下函数:classSolution{publicintsoluition(StringA,StringB);}其应当满足的功能为:给定包含N个字母的stringA和包含M个字母的stringB,返回使得B成为其子字符串A需&要重复自己的最少次数。如果无论A重复自己多少次B都无法成为其子字符串,返回-1。如下面例子所示:A=&abcd&B=&cdabcdab&这种情况下该函数需要返回3,因为A重复3次后成为`”abcdabcd
实现如下函数:
class Solution {public int soluition(String A, String B); }
其应当满足的功能为:给定包含N个字母的string A和包含M个字母的string B,返回使得B成为其子字符串A需& 要重复自己的最少次数。如果无论A重复自己多少次B都无法成为其子字符串,返回-1。 如下面例子所示:
A = &abcd&
B = &cdabcdab&
这种情况下该函数需要返回3,因为A重复3次后成为`”abcdabcdabcd”,此时B是该字符串的子串。 本题假定: N是[1…1000]内的整数。 M是[1…1000]内的整数。
给定两个string A和B,当B的长度大于A时,即使在brute-force解法的情况下(既不断重复A,看B能够成为当前字符串的子串),我们仍然首先要确定的是B究竟能够成为A重复自己所构造的字符串的子串。因为这决定了这个循环的结束条件。
注意到B如果能够由A不断重复自己得到,那么B中的任何和A的长度相等的连续子字符串都必须能够由A的rotation得到。例如上面的A和B的例子中,从B中取出任何一个长度为4的连续子字符串,都能够由A的rotation产生。所以我们只需要产生A的所有rotation并将它们存入HashSet中,然后再遍历一遍B中的所有长度与A相同的连续子字符串,就可以知道B能够由A重复自己产生。这一步骤的时间复杂度为:O(N + M),空间复杂度为O(N ^ 2)。
O(N + M)时间复杂度:因为我们需要分别遍历A的所有rotation和B的所有长度与A相同的连续子字符串,分别是N种可能和M中可能,所以是O(N + M)。
O(N ^ 2)空间复杂度:因为我们需要存储所有A的rotation,一共是N种,而每一种包括N个字母,所以总空间为O(N ^ 2)。
当我们确定了B一定能由A不断重复自己得到之后,我们就只需要确定A最少需重复几次。这一步骤当然可以通过不断让A重复自己并判断B是否是当前字符串的子字符串实现。但这一方法并不是最优解。实际上考虑到B一定是A的rotation组成的,A的最少重复次数可以在O(1)时间,O(1)空间内实现, 方法如下:
用HashMap而非HashSet来存储A的rotation。其中Key为A的rotation,Value为A成为当前rotation所需要的向左滚动的步数。例如上面的例子中的A,其所构造出的HashMap为:
&abcd&: 0,
&bcda&: 1,
&cdab&: 2,
&dabc&: 3,
这样的情况下我们只需要判断B中的第一个长度与A相同的连续子字符串的rotation步数即可。
如果为0,则代表A只需要重复到(设A重复自己组成的字符串为A’)A'.length() &= B.length()即可,既重复B.length() / A.length()向上取整次,也就是:B.length() / A.length() + (B.length() % A.length() == 0 ? 0 : 1)。
如果不为0,则代表除去需要重复上面的次数之外,还需要额外的一次重复来满足c的开头部分。如上面的例子中:A重复两次即可满足上面的第一个条件。但这个时候B的开头的&cd&并没有成为子串,所以需要额外重复一次满足B的开头。也就是三次。也就是重复次数为:1 + B.length() / A.length() +(B.length() % A.length() == 0 ? 0 : 1)。
需要注意的是,我们以上所有的讨论基于B的长度大于A的情况进行。如果B的长度小于A,我们只需要直接判断B是否为A的子字符串即可。这个判断可以通过KMP算法进行,从而将时间控制在O(N)内。
以上算法的代码如下:
public class Solution {
* Given 2 string A and B, return the minimum number A need to repeat itself in order
* for B to become a substring of the repeated sequence of A.
* In order for B to be able to become a substring of A's repeat, every B's substring
* with the same length of A need to satisfy the requirement that it can be generated
* through A's rotation. For example, A = &abcd& and B = &cdabcdab&, every of B's substring
* need to some rotations of A, e.g. &bcda&, &cdab&, &dabc&, &abcd&.
* If such a requirement is not satisfied, then -1 is returned to indicate that B cannot be obtained
* through A's repeating itself.
* Otherwise, the minimum number of repeat needed for A is calculated as following:
* 1. If B shares the same start pattern as A, ceil devision of B's length to A's length
* is the minimum number of repeat needed.
* 2. If B starts from some middle point character with A, then the minimum number of repeat
* needed is the ceil devision of B's length to A's length plus 1.
public static int minimumNumberRepeat(String A, String B) {
// If A contains no character, then B cannot be obtained
// by repeating A
if (A == null || A.length() == 0) {
return -1;
// If A is longer than B, search for B in A directly.
if (A.length() & B.length()) {
// repeat at most once to deal with condition like this:
// A = &abcd&, B = &da&
for (int i = 0; i & 2; i++) {
String curr = new String(new char[i + 1]).replaceAll(&/0&, A);
if (curr.contains(B)) {
return i + 1;
return -1;
permutationsA = new HashMap
permutationsA.put(A, 0);
for (int i = 0; i & A.length() - 1; i++) {
String permutationA = A.substring(i + 1, A.length()) + A.substring(0, i + 1);
permutationsA.put(permutationA, i + 1);
// Check if any substring of B cannot be generated by A's permutation
for (int i = 0; i &= B.length() - A.length(); i++) {
String subB = B.substring(i, i + A.length());
if (!permutationsA.containsKey(subB)) {
return -1;
// If every substring of B can be generated by A's permutation
int rotation = permutationsA.get(B.substring(0, A.length()));
if (rotation == 0) {
return B.length() / A.length() + (B.length() % A.length() == 0 ? 0 : 1);
return 1 + B.length() / A.length() +(B.length() % A.length() == 0 ? 0 : 1);
进一步的思考
注意到经过上面的分析,我们知道不论在何种情况下,A最多只需重复1 + B.length() / A.length() +(B.length() % A.length() == 0 ? 0 : 1)我们就可以判断出B是否能成为A不断重复自己构成的字符串的子串。所以我们只需要使用for循环检查这么多次即可。这种方法for循环的时间复杂度为O((M/N) * N) = O(M)。for循环中检查B是否为当前字符串的子串可以用KMP算法实现worst case为O((M/N) * N) = O(M)。所以算法的时间复杂度为O(M ^ 2)。算法空间复杂度为O(M)因为我们最坏情况下只需要存储一个长度大于等于M但小于M+N的字符串。
这种算法虽然时间复杂度上不如之前的算法,但胜在实现简单不用处理太多的特殊情况。
算法的具体实现如下:
public class Solution {
public static int repeat(String A, String B) {
// If A contains no character, then B cannot be obtained
// by repeating A
if (A == null || A.length() == 0) {
return -1;
int totalTimes = 1 + B.length() / A.length() +(B.length() % A.length() == 0 ? 0 : 1);
for (int i = 0; i & totalT i++) {
String repeated = new String(new char[i + 1]).replaceAll(&/0&, A);
if (repeated.contains(B)) {
return i + 1;
return -1;
这里可能需要说明的一点是上面我用来重复A所使用的代码:String repeated = new String(new char[n]).replaceAll(&/0&, A)。其中n是我们想要重复A的次数。这段代码的工作原理是这样的:
首先我们用char[n]初始化了一个String。由于在这个char[n]数组中我们没有给出任何初始值,所以生成的String中的每一个字符的值都为null,其中共有n个字符。接下来我们用replaceAll(regex, value)这个方法匹配所有的null,也就是&/0&并将它们都替换为A,因此也就将A重复了n次。
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
邮箱低至5折
推荐购买再奖现金,最高25%
&200元/3月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
Google OA题目:给出使得字符串B成为字符串A重复自己构成的字相关信息,包括
的信息,所有Google OA题目:给出使得字符串B成为字符串A重复自己构成的字相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
["广东","广州","从化镇"]这段字符串有没有办法截出"之间的内容?搞了很久,百度也查不到,大神路过帮忙看看,谢谢!
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
你这问题问的牛头不对马嘴啊,下面说是字符串,上面给出又是一个数组?我大概猜了一下,你可以试试用split把字符串根据指定的字符分割成数组。
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。A-B 字符串删除
本题要求你计算A-BA-B。不过麻烦的是,AA和BB都是字符串
—— 即从字符串AA中把字符串BB所包含的字符全删掉,剩下的字符组成的就是字符串A-BA-B。
输入格式:
输入在2行中先后给出字符串AA和BB。两字符串的长度都不超过10^4104,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。
输出格式:
在一行中打印出A-BA-B的结果字符串。
输入样例:
I love GPLT!
It's a fun game!
输出样例:
I lv GPLT!
时间限制:90ms内存限制:64MB代码长度限制:16kB判题程序:系统默认作者:陈越单位:浙江大学
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!下面叙述正确的是 。 A)两个字符串所包含的字符个数相同时,才能比较字符串 B)字符个数多的字符串比字符_百度知道
下面叙述正确的是 。 A)两个字符串所包含的字符个数相同时,才能比较字符串 B)字符个数多的字符串比字符
下面叙述正确的是 。A)两个字符串所包含的字符个数相同时,才能比较字符串B)字符个数多的字符串比字符个数少的字符串大C)字符串”STOP ”与”STOP”相等D)字符串”That”小于字符串”The”最好能解释下,本人不太会的
我有更好的答案
答案是D。A选项:比较字符串并不在乎两个字符串的长度,而是逐个比较两个字符串中的字符的ASCII值,若相等则继续比较,否则返回两个字符ASCII值的差。B选项:道理同A。C选项:两个字符串不会相等,因为它们保存在不同的地址,只有字符串的值才会相等。D选项:正确,而且返回-4,因为'a' - 'e'为-4。
为您推荐:
其他类似问题
字符串的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。 上传我的文档
 下载
 收藏
粉丝量:36
该文档贡献者很忙,什么也没留下。
 下载此文档
1算法及其描述(2-3) 一、 选择题 1 下面关于算法的描述,正确的是 A
下载积分:1500
内容提示:1算法及其描述(2-3) 一、 选择题 1 下面关于算法的描述,正确的是 A
文档格式:DOC|
浏览次数:3755|
上传日期: 06:18:45|
文档星级:
全文阅读已结束,如果下载本文需要使用
 1500 积分
下载此文档
该用户还上传了这些文档
1算法及其描述(2-3) 一、 选择题 1 下面关于算法的描
关注微信公众号

我要回帖

更多关于 字符串格式不正确原因 的文章

 

随机推荐