Redian新闻
>
年代久远的充电电池和充电器还能用不?
avatar
年代久远的充电电池和充电器还能用不?# Living
x*8
1
A, B两个String
//example
A = XYZ;
A^2 = XXYYZZ;
A^3 = XXXYYYZZZ;
B = XXadhflakjhelXXzzqqkkpoYYadadfhgakheZafhajkefhlZadhflkejhZfagjhfebhh
A^2 是B的subsequence, 所以
return k = 2;
A可能有重复的char, B可能有其他字符, 求k.
avatar
t*e
2
一个充电器和一堆充电电池,我觉得应该4年以上了吧,都不记得过去4年用过它们没有
。(如果用,可能用过其中2个,用了一会儿,因为发现在某个小电器里面)
有些的头已经有渣了,所以放在一旁准备找回收处。
还有3个看着比较新(就是其中2个在某个小电器里发现的)。
不知道还能用不。
试之前问一下。
avatar
I*a
3
subsequence不管顺序吗? 那就hashmap统计A中字符的频率,然后统计B中对应字符的
频率,然后频率相除ratio中最小的就是k. O(n) time + O(n) space

【在 x******8 的大作中提到】
: A, B两个String
: //example
: A = XYZ;
: A^2 = XXYYZZ;
: A^3 = XXXYYYZZZ;
: B = XXadhflakjhelXXzzqqkkpoYYadadfhgakheZafhajkefhlZadhflkejhZfagjhfebhh
: A^2 是B的subsequence, 所以
: return k = 2;
: A可能有重复的char, B可能有其他字符, 求k.

avatar
b*e
4
可以对k进行二分。复杂度O(n*log(n))。

【在 x******8 的大作中提到】
: A, B两个String
: //example
: A = XYZ;
: A^2 = XXYYZZ;
: A^3 = XXXYYYZZZ;
: B = XXadhflakjhelXXzzqqkkpoYYadadfhgakheZafhajkefhlZadhflkejhZfagjhfebhh
: A^2 是B的subsequence, 所以
: return k = 2;
: A可能有重复的char, B可能有其他字符, 求k.

avatar
k*r
5
String A = "XXZ";
String B = "
XXadhflakjhelXXzzqqkkpoYYadadfhgakheZafhajkefhlZadhflkejhZfagjhfebhh";
这样有重复的例子是return 2吗。
avatar
j*3
6
题目就很啰嗦
avatar
j*3
7
这个怎么算啊?
adhflakjhelXXzzqqkkpoYYYadadfhgakheZafhajkefhlZadhflkejhZfagjhfebhh也是k=2么?
我在中间多加了一个Y
avatar
l*s
8
抠字符,抠到抠不出为止。O(n*k)

【在 x******8 的大作中提到】
: A, B两个String
: //example
: A = XYZ;
: A^2 = XXYYZZ;
: A^3 = XXXYYYZZZ;
: B = XXadhflakjhelXXzzqqkkpoYYadadfhgakheZafhajkefhlZadhflkejhZfagjhfebhh
: A^2 是B的subsequence, 所以
: return k = 2;
: A可能有重复的char, B可能有其他字符, 求k.

avatar
s*a
9
二分不行吧。二分以后朝哪个方向走呢?

【在 b***e 的大作中提到】
: 可以对k进行二分。复杂度O(n*log(n))。
avatar
x*8
10
是的

【在 k****r 的大作中提到】
: String A = "XXZ";
: String B = "
: XXadhflakjhelXXzzqqkkpoYYadadfhgakheZafhajkefhlZadhflkejhZfagjhfebhh";
: 这样有重复的例子是return 2吗。
:

avatar
b*e
11
你理解错了。我的意思是对于某一个特定的k,判断B中有没有A^k是一个线性O(n)的问
题。并且k有解则对于所有的i有乜解,然后看k = 2, 4, 8, ...一直找到最终的k. O(n*log(k))。

【在 s*a 的大作中提到】
: 二分不行吧。二分以后朝哪个方向走呢?
avatar
l*u
12
先找A^3,找到return 3
再找A^2,找到return 2
最后找A,找到return 1?

【在 x******8 的大作中提到】
: A, B两个String
: //example
: A = XYZ;
: A^2 = XXYYZZ;
: A^3 = XXXYYYZZZ;
: B = XXadhflakjhelXXzzqqkkpoYYadadfhgakheZafhajkefhlZadhflkejhZfagjhfebhh
: A^2 是B的subsequence, 所以
: return k = 2;
: A可能有重复的char, B可能有其他字符, 求k.

avatar
x*8
13
就是这个意思

【在 l*********u 的大作中提到】
: 先找A^3,找到return 3
: 再找A^2,找到return 2
: 最后找A,找到return 1?

avatar
l*u
14
A是已知的?还是要自己从B里找?

【在 x******8 的大作中提到】
: 就是这个意思
avatar
k*r
15
我的思路:
建立一个一维dp table,大小为A的size;
开始dp表都是0,遇到A中一个元素,查看dp table的对应value和dp[i-1]的value。
如果dp[i -1] 》 dp[i] ,dp[i]++;
都完事了dp[n - 1]就是结果。

【在 l*********u 的大作中提到】
: 先找A^3,找到return 3
: 再找A^2,找到return 2
: 最后找A,找到return 1?

avatar
n*s
16
先把B弄成XXXXYYZZZ, 然后。。。
avatar
n*s
17
0

么?

【在 j**********3 的大作中提到】
: 这个怎么算啊?
: adhflakjhelXXzzqqkkpoYYYadadfhgakheZafhajkefhlZadhflkejhZfagjhfebhh也是k=2么?
: 我在中间多加了一个Y

avatar
x*8
18
能具体说说思路吗?

【在 k****r 的大作中提到】
: 我的思路:
: 建立一个一维dp table,大小为A的size;
: 开始dp表都是0,遇到A中一个元素,查看dp table的对应value和dp[i-1]的value。
: 如果dp[i -1] 》 dp[i] ,dp[i]++;
: 都完事了dp[n - 1]就是结果。

avatar
l*u
19
brilliant

【在 k****r 的大作中提到】
: 我的思路:
: 建立一个一维dp table,大小为A的size;
: 开始dp表都是0,遇到A中一个元素,查看dp table的对应value和dp[i-1]的value。
: 如果dp[i -1] 》 dp[i] ,dp[i]++;
: 都完事了dp[n - 1]就是结果。

avatar
l*u
20
俺那种要扫3次,这位网友的是1次

【在 x******8 的大作中提到】
: 能具体说说思路吗?
avatar
m*2
21
看起来有戏,xyzxyz这种算k=2还是1

【在 k****r 的大作中提到】
: 我的思路:
: 建立一个一维dp table,大小为A的size;
: 开始dp表都是0,遇到A中一个元素,查看dp table的对应value和dp[i-1]的value。
: 如果dp[i -1] 》 dp[i] ,dp[i]++;
: 都完事了dp[n - 1]就是结果。

avatar
m*2
22
有一个笨办法,不知道对不对,其实就是统计:
1. Y出现以前X的个数 xcount
2. Y的个数 ycount
3. Y出现以后的Z的个数 zcount
再算三者的最小值
因为第一个Y出现以后的X都没有意义,最后一个Y之前的Z也没有意义
int xcount = 0;
int ycount = 0;
int zcount = 0;
boolean ystarted = false;
for (int i = 0; i < n; i++) {
switch(A[i]) {
case 'X': {
if (ystarted == false) {
xcount++;
}
break;
}
case 'Y': {
ycount++;
ystarted = true;
zcount = 0;
break;
}
caes 'Z': {
zcount++;
break;
}
}
return min(xcount,ycount,zcount);
}
avatar
k*r
23
按lz要求应该是1,按我之前的描述结果是2.
解决办法:增加另一个p[a],纪录每个元素新开始数数时候的dp[i - 1],
这样的话,每次想加dp[i]的时候需要增加个判断,看p[a]是不是大于dp[i]。
yes才能加。但什么时候update p[a]我没太想清楚。。。。

【在 m***2 的大作中提到】
: 看起来有戏,xyzxyz这种算k=2还是1
avatar
k*r
24
明显不行:XYXXYYZZ。
按您的思路似乎算不出2了,且算法不是ad hoc

【在 m***2 的大作中提到】
: 有一个笨办法,不知道对不对,其实就是统计:
: 1. Y出现以前X的个数 xcount
: 2. Y的个数 ycount
: 3. Y出现以后的Z的个数 zcount
: 再算三者的最小值
: 因为第一个Y出现以后的X都没有意义,最后一个Y之前的Z也没有意义
: int xcount = 0;
: int ycount = 0;
: int zcount = 0;
: boolean ystarted = false;

avatar
m*2
25
也是

【在 k****r 的大作中提到】
: 明显不行:XYXXYYZZ。
: 按您的思路似乎算不出2了,且算法不是ad hoc

avatar
w*u
26
显然这是错的。
参见 s = "xyxy" a = "xy"
你这个结果是2,实际应该是1.

【在 k****r 的大作中提到】
: 我的思路:
: 建立一个一维dp table,大小为A的size;
: 开始dp表都是0,遇到A中一个元素,查看dp table的对应value和dp[i-1]的value。
: 如果dp[i -1] 》 dp[i] ,dp[i]++;
: 都完事了dp[n - 1]就是结果。

avatar
w*u
27
这题目好难,用动态规划也解不出。
avatar
k*r
28
meme同学,你咋总是写3个的呢?A的size不是3咋办:)

max[

【在 m***2 的大作中提到】
: 也是
avatar
m*2
29
先按3来嘛,要是对了我再扩展到m

【在 k****r 的大作中提到】
: meme同学,你咋总是写3个的呢?A的size不是3咋办:)
:
: max[

avatar
m*2
30
总的来说就是一轮一轮的扫描,一旦发现顺序不是XYZ这种,就开始重新一轮
每一轮用count[]来记当前轮,用max[]来记录历史上最多的
具体如下:
比如XXYY XYYZ YYZ XYY XXYYZ就是5轮:
1. XXYY
2. XYYZ
3. YYZ
4. XYY
5. XXYYZ
每次发现ch[i] < ch[i - 1]就表示顺序不对了,开始新的一轮,count全部清空
max[0]表示历史上X^的最大次数
max[1]表示历史上XY^的最大次数
max[2]表示历史上XYZ^的最大次数
public class Solution {
public int getK(String B) {
char[] ch = B.toCharArray();
int n = B.length();
int[] count = new int[3];
int[] max = new int[3];
for (int i = 0; i < n; i++) {
if (i == 0 || ch[i - 1] > ch[i]) { //顺序不对就清空重新计数
count[0] = 0;
count[1] = 0;
count[2] = 0;
}
switch(ch[i]) {
case 'X': {
count[0]++;
max[0] = Math.max(max[0],count[0]);
break;
}
case 'Y': {
if (count[1] < max[0]) { //X够了才计Y
count[1]++;
max[1] = Math.max(max[1],count[1]);
break;
}
}
case 'Z': {
if (count[2] < max[1]) {//XY够了才计Z
count[2]++;
max[2] = Math.max(max[2],count[2]);
break;
}
}
}
}
return max[2];
}
}
谁来帮忙想个妖孽的测试集吧!
XYXXYZXXYXZYZZZYXX
自己跑出不对了,应该返回3才对,跪了
啊啊,突然被这句话打败了:
A可能有重复的char
avatar
b*e
31
不用拿个dp的锤子到处找钉子。这个题直接搞就好了。
Test if A^k is in B takes simple O(n), as follows:
var test = function(A, k, B) {
var i = 0;
var next = A[i];
var quota = k;
for(j = 0; j < B.length; j++) {
if (B[j] == next) {
quota--;
}
if (quota == 0) {
i++;
if (i >= A.length) {
return true;
} else {
next = A[i];
quota = k;
}
}
}
return false;
};
Then apply binary search to find the largest k, as follows:
var searchK = function(A, B) {
var bot = 1;
var top = Math.floor(B.length / A.length);
while (bot < top) {
var mid = (bot + top) / 2;
if (test(A, mid, B)) {
bot = mid;
} else {
top = mid;
}
}
return test(A, top, B);
};
This take O(n*log(k)), overall.

【在 w*******u 的大作中提到】
: 这题目好难,用动态规划也解不出。
avatar
m*2
32
就酱,挺好

【在 b***e 的大作中提到】
: 不用拿个dp的锤子到处找钉子。这个题直接搞就好了。
: Test if A^k is in B takes simple O(n), as follows:
: var test = function(A, k, B) {
: var i = 0;
: var next = A[i];
: var quota = k;
: for(j = 0; j < B.length; j++) {
: if (B[j] == next) {
: quota--;
: }

avatar
p*g
33
请教一下 A 是ab, B是ababab 那么K是多少呢?谢谢。

【在 b***e 的大作中提到】
: 不用拿个dp的锤子到处找钉子。这个题直接搞就好了。
: Test if A^k is in B takes simple O(n), as follows:
: var test = function(A, k, B) {
: var i = 0;
: var next = A[i];
: var quota = k;
: for(j = 0; j < B.length; j++) {
: if (B[j] == next) {
: quota--;
: }

avatar
b*e
34
1

【在 p*********g 的大作中提到】
: 请教一下 A 是ab, B是ababab 那么K是多少呢?谢谢。
avatar
p*g
35
能解析一下你的程序,在ababab去8情况下是输出几吗?不好意思,在外面,没有电脑。

【在 b***e 的大作中提到】
: 1
avatar
k*r
36
是2吧大牛

【在 b***e 的大作中提到】
: 1
avatar
w*1
37
我也觉的肯定是2,不然一点难度都没有

【在 k****r 的大作中提到】
: 是2吧大牛
avatar
n*s
38
你看到aabb了?

【在 w*****1 的大作中提到】
: 我也觉的肯定是2,不然一点难度都没有
avatar
b*e
39
看花眼了,是2。

【在 k****r 的大作中提到】
: 是2吧大牛
avatar
l*i
40
@blaze: wrong solution, the variable "i" never resets. try "aabaabbcc".
avatar
b*e
41
Come on, did you even seriously read my post?

【在 l*******i 的大作中提到】
: @blaze: wrong solution, the variable "i" never resets. try "aabaabbcc".
avatar
l*i
42
@Blaze. Sorry. I jumped the gun a bit. Ur solution should work.
avatar
l*u
43
应该是2,B里有aabb

【在 b***e 的大作中提到】
: 1
avatar
l*n
44
逻辑有问题,quote到头之后直接检查下一个char in A了,这不对。比如test("xyx",
2, "aaxxyyyxxaa"),检查每个char都符合quota,但其实应该fail。
if (quota == 0) {
i++;
if (i >= A.length) {
return true;
} else {
next = A[i];
quota = k;
}
}

【在 b***e 的大作中提到】
: 不用拿个dp的锤子到处找钉子。这个题直接搞就好了。
: Test if A^k is in B takes simple O(n), as follows:
: var test = function(A, k, B) {
: var i = 0;
: var next = A[i];
: var quota = k;
: for(j = 0; j < B.length; j++) {
: if (B[j] == next) {
: quota--;
: }

avatar
f*y
45
他解法没错吧。 subsequence 就是按顺序,但是可以不连续
对了,复杂度应该是 o(n* log(n/k)) = o(n*logn - n*logk) 吧,要是k很小,实际接
近o(n*logn)

逻辑有问题,quote到头之后直接检查下一个char in A了,这不对。比如test("xyx",
2, "aaxxyyyxxaa"),检查每个char都符合quota,但其........

【在 l*n 的大作中提到】
: 逻辑有问题,quote到头之后直接检查下一个char in A了,这不对。比如test("xyx",
: 2, "aaxxyyyxxaa"),检查每个char都符合quota,但其实应该fail。
: if (quota == 0) {
: i++;
: if (i >= A.length) {
: return true;
: } else {
: next = A[i];
: quota = k;
: }

avatar
l*n
46
哦,我看成substring了。subsequence的话是没问题了。

,

【在 f********y 的大作中提到】
: 他解法没错吧。 subsequence 就是按顺序,但是可以不连续
: 对了,复杂度应该是 o(n* log(n/k)) = o(n*logn - n*logk) 吧,要是k很小,实际接
: 近o(n*logn)
:
: 逻辑有问题,quote到头之后直接检查下一个char in A了,这不对。比如test("xyx",
: 2, "aaxxyyyxxaa"),检查每个char都符合quota,但其........

avatar
I*g
47
ZENEFITS问这么傻逼的问题,关键它能够给多少的package?

【在 x******8 的大作中提到】
: A, B两个String
: //example
: A = XYZ;
: A^2 = XXYYZZ;
: A^3 = XXXYYYZZZ;
: B = XXadhflakjhelXXzzqqkkpoYYadadfhgakheZafhajkefhlZadhflkejhZfagjhfebhh
: A^2 是B的subsequence, 所以
: return k = 2;
: A可能有重复的char, B可能有其他字符, 求k.

avatar
b*e
48
substring的话就太容易了。

【在 l*n 的大作中提到】
: 哦,我看成substring了。subsequence的话是没问题了。
:
: ,

avatar
b*e
49
还是送佛送到西:其实我前面的一个帖子说了,k要从小向大试探,比如k=1,2,4,8,...
,一直到k过大。这以后二分。严格的log(k)个pass。我的程序里做了简化。

,

【在 f********y 的大作中提到】
: 他解法没错吧。 subsequence 就是按顺序,但是可以不连续
: 对了,复杂度应该是 o(n* log(n/k)) = o(n*logn - n*logk) 吧,要是k很小,实际接
: 近o(n*logn)
:
: 逻辑有问题,quote到头之后直接检查下一个char in A了,这不对。比如test("xyx",
: 2, "aaxxyyyxxaa"),检查每个char都符合quota,但其........

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。