count-the-repetitions
https://leetcode.com/problems/count-the-repetitions/
下面是我的方法,结果对的,超时了。。。
package com.company;
class Solution {
public int getMaxRepetitions(String s1, int n1, String s2, int n2) {
int len1 = s1.length();
int[][]stores = new int[26][len1];
int[] pos = new int[26];
int[] cur = new int[26];
int index;
for (int i=0; i<len1; i++) {
index = s1.charAt(i)-'a';
stores[index][pos[index]] = i;
pos[index] = pos[index] + 1;
}
int curPos = 0;
int ret = 0;
int len2 = s2.length();
while (true) {
for (int i=0; i<n2; i++) {
for (int j=0; j<len2; j++) {
index = s2.charAt(j) - 'a';
if (cur[index] >= pos[index] * n1) {
return ret;
}
int newPos = 0;
do {
newPos = cur[index] / pos[index] * len1 + stores[index][cur[index] % pos[index]];
cur[index] = cur[index] + 1;
} while (newPos < curPos && cur[index] < pos[index] * n1);
if (newPos < curPos) {
return ret;
}
curPos = newPos + 1;
}
}
ret++;
}
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
String s1 = "niconiconi";
int n1 = 99981;
String s2 = "nico";
int n2 = 81;
Solution solution = new Solution();
int ret = solution.getMaxRepetitions(s1, n1, s2, n2);
// Your Codec object will be instantiated and called as such:
System.out.printf("ret:%d\n", ret);
System.out.println();
}
}
优化之后的结果,还是超时:
加了string到array的优化,另外每次循环之后坐个判断剪枝。
package com.company;
class Solution {
public int getMaxRepetitions(String s1, int n1, String s2, int n2) {
int len1 = s1.length();
int[][]stores = new int[26][len1];
int[] pos = new int[26];
int[] cur = new int[26];
int index;
for (int i=0; i<len1; i++) {
index = s1.charAt(i)-'a';
stores[index][pos[index]] = i;
pos[index] = pos[index] + 1;
}
int curPos = 0;
int ret = 0;
int len2 = s2.length();
char[] array2 = s2.toCharArray();
while (true) {
for (int i=0; i<n2; i++) {
for (int j=0; j<len2; j++) {
index = array2[j] - 'a';
int newPos = 0;
while (cur[index] < pos[index] * n1) {
newPos = cur[index] / pos[index] * len1 + stores[index][cur[index] % pos[index]];
cur[index] = cur[index] + 1;
if (newPos >= curPos) {
break;
}
}
if (newPos < curPos) {
/*System.out.printf("index %d cur[index] %d pos[index] %d cur/-pos %d, store %d\n",
index, cur[index], pos[index], cur[index] % pos[index], stores[index][cur[index] % pos[index]]);
System.out.printf("newPos %d curPos %d\n",
newPos, curPos);
*/
return ret;
}
curPos = newPos + 1;
}
}
ret++;
for (int i=0; i<26; i++) {
if (pos[i] > 0 && cur[i] >= pos[i] * n1) {
return ret;
}
}
}
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
String s1 = "acb";
int n1 = 4;
String s2 = "ab";
int n2 = 2;
Solution solution = new Solution();
int ret = solution.getMaxRepetitions(s1, n1, s2, n2);
// Your Codec object will be instantiated and called as such:
System.out.printf("ret:%d\n", ret);
System.out.println();
}
}
用了这种Brute Force的方法,居然比我的快。。。。。。
public class Solution {
public int getMaxRepetitions(String s1, int n1, String s2, int n2) {
char[] array1 = s1.toCharArray(), array2 = s2.toCharArray();
int count1 = 0, count2 = 0, i = 0, j = 0;
while (count1 < n1) {
if (array1[i] == array2[j]) {
j++;
if (j == array2.length) {
j = 0;
count2++;
}
}
i++;
if (i == array1.length) {
i = 0;
count1++;
}
}
return count2 / n2;
}
}
(完)
count-the-repetitions的更多相关文章
- CH5702 Count The Repetitions
题意 5702 Count The Repetitions 0x50「动态规划」例题 描述 定义 conn(s,n) 为 n 个字符串 s 首尾相接形成的字符串,例如: conn("abc& ...
- [Swift]LeetCode466. 统计重复个数 | Count The Repetitions
Define S = [s,n] as the string S which consists of n connected strings s. For example, ["abc&qu ...
- 466. Count The Repetitions
Define S = [s,n] as the string S which consists of n connected strings s. For example, ["abc&qu ...
- [LeetCode] Count The Repetitions 计数重复个数
Define S = [s,n] as the string S which consists of n connected strings s. For example, ["abc&qu ...
- Leetcode: Count The Repetitions
Define S = [s,n] as the string S which consists of n connected strings s. For example, ["abc&qu ...
- CH5702 Count The Repetitions[倍增dp]
http://contest-hunter.org:83/contest/0x50%E3%80%8C%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E3%80%8D%E4%B ...
- 【leetcode 字符串】466. Count The Repetitions
https://leetcode.com/problems/count-the-repetitions/description/ 找循环节 https://www.cnblogs.com/grandy ...
- 第七周 Leetcode 466. Count The Repetitions 倍增DP (HARD)
Leetcode 466 直接给出DP方程 dp[i][k]=dp[i][k-1]+dp[(i+dp[i][k-1])%len1][k-1]; dp[i][k]表示从字符串s1的第i位开始匹配2^k个 ...
- [LeetCode] 466. Count The Repetitions 计数重复个数
Define S = [s,n] as the string S which consists of n connected strings s. For example, ["abc&qu ...
- LeetCode466. Count The Repetitions
题目链接 传送门 题意 定义一个特殊的串, 现在给出串S1和S2的参数, 问: S2最多可以多少个连接起来扔是S1的子序列, 求出这个最大值 解题思路 注意s1与S1的区别, 可以去看题目描述, 预处 ...
随机推荐
- 利用Session实现一次验证码
Session可避免表单的重复提交:实现一次表单提交,可避免恶意提交: 1.首先建立一个Servlet类:ValidateColorServlet,里边有获取验证码的方法,并且验证码是大小写区分: p ...
- 20151224001 GridView 多按钮的各种使用方法
<asp:GridView ID="GridView1" runat="server" AllowPaging=" ...
- jquery闭包的使用
<div id="divTest"> Test </div> <br /> <hr /> <div id="divT ...
- Python学习笔记-Day2-Python基础之字符串操作
字符串的常用操作包括但不限于以下操作: 字符串的替换.删除.截取.复制.连接.比较.查找.分割等 这里将对字符串的内置操作方法进行总结归纳,重点是以示例的方式进行展示. 使用type获取创建对象的类 ...
- linux(centos)下SVN服务器如何搭建
检测是否符合pptp的搭建环境的要求 使用下面的指令: 123 cat /dev/net/tun如果这条指令显示结果为下面的文本,则表明通过:cat: /dev/net/tun: File descr ...
- 动态创建Layout
public Form1() { InitializeComponent(); AddLayoutItems1(); //初始化 } /// <summary> /// 1.一个方法(定义 ...
- File.separator
摘自:http://blog.csdn.net/chindroid/article/details/7735832
- DEBUG模式开关
在.NET中,有一个特殊的特性可以用:[Conditional("DEBUG")]MyConstructor(IExtensionManager mgr){...}
- css做的后台管理页面,不考虑ie8一下的
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- 注册dll失败
注册DLL的时候一出现错误: win8下: (右键弹出) 如果再不行, 64位系统下,把DLL移动到C:\Windows\SysWOW64下 更改路径