- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题 - 如果一个字符串可以通过连接同一字符串的两个副本获得,则该字符串称为方形字符串。例如,“abab”、“aa”是方形字符串,而“aaa”、“abba”则不是。给定一个字符串,该字符串有多少个子序列是方形字符串?从字符串中删除零个或多个字符,并保持剩余字符的相对顺序,可以获得字符串的子序列。
输入格式
第一行包含测试用例的数量 T。接下来是 T 个测试用例。每个 case 都包含一个字符串 S。
输出格式
输出 T 行,每个测试用例一行,包含对 1000000007 求模的所需答案。
约束:1≤T≤20S 最多包含 200 个小写字符('a' - 'z')。
示例输入
3
aaa
abab
baaba
示例输出
3
3
6
我的代码只通过了 2 个测试用例,因为大字符串的递归需要超过 4 秒才能生成答案,所以测试用例没有通过
我最初打算导出所有可能的子序列,然后我将检查导出的子序列是否是方形子序列
谁能给我一个更好的主意来解决它而不实际生成子序列
import java.io.*;
import java.util.*;
public class Subsequence {
static int count;
public static void print(String prefix, String remaining, int k) {
if (k == 0) {
//System.out.println(prefix);
if(prefix.length() %2 == 0 && check(prefix) != 0 && prefix.length() != 0)
{
count++;
//System.out.println(prefix);
}
return;
}
if (remaining.length() == 0)
return;
print(prefix + remaining.charAt(0), remaining.substring(1), k-1);
print(prefix, remaining.substring(1), k);
}
public static void main(String[] args)
{
//String s = "aaa";
Scanner sc = new Scanner(System.in);
int t=Integer.parseInt(sc.nextLine());
while((t--)>0)
{
count = 0;
String s = sc.nextLine();
for(int i=0;i<=s.length();i++)
{
print("",s,i);
}
System.out.println(count);
}
}
public static int check(String s)
{
int i=0,j=(s.length())/2;
for(;i<(s.length())/2 && j < (s.length());i++,j++)
{
if(s.charAt(i)==s.charAt(j))
{
continue;
}
else
return 0;
}
return 1;
}
}
最佳答案
基本思想:我们可以将所有可以从给定输入字符串派生的正方形序列排列成树状图 - 基本上是将几棵树合并为一棵树,并允许多个父树。这些树中的每棵树都有一个(局部)最长的可能正方形序列作为根,叶子都是长度为 2 的正方形子序列,可以从根序列中导出。现在找到所有可能的子序列的最简单方法是以任何给定的方式简单地遍历这棵树并计算节点数。由于很难找到给定输入的(局部)最长可能的正方形序列,我们使用另一个选项:从叶子开始并遍历到最长的序列。只需搜索所有可能的长度为 2 的正方形序列,就可以轻松找到这些。
方形序列之间的关系示例如下:
input: agbhbeiauzbib
longest sequences: abbabb and abiabi
childsequences of abbabb:
2x abab
bbbb
these sequences would have subsequences themselves of length 2
现在从理论到实践:
由于输入字符串中字符的位置与不同的两个序列相关(input: "aaa" sequences: 01->"aa" 02->"aa"
我们可以区分这些序列,尽管它们产生相同的字符串),子序列可以表示为 List<Integer>
.
现在第一步:找到所有可能的长度为 2 的正方形子序列:基本上我们需要做的就是找到长度为 2 的索引的所有排列,这样索引指向输入字符串中的等效字符。
private static List<List<Integer>> listDoubleSequences(String in)
{
List<List<Integer>> result = new ArrayList<>();
//map all characters to their indices in the inputstring
HashMap<Character , List<Integer>> posMap = new HashMap<>();
for(int i = 0 ; i < in.length() ; i++)
{
char c = in.charAt(i);
if(posMap.get(c) == null)
posMap.put(c , new ArrayList<>());
posMap.get(c).add(i);
}
System.out.println(posMap);
posMap.values().forEach(indices -> {
//find all possible permutations with length 2
for (int i = 0; i < indices.size(); i++)
for (int j = i + 1; j < indices.size(); j++) {
List<Integer> seq = new ArrayList<>();
seq.add(indices.get(i));
seq.add(indices.get(j));
result.add(seq);
}
});
System.out.println("Found double sequences:");
result.forEach(l -> printSeq(in, l));
return result;
}
既然找到了这些序列,剩下的就很简单了:长度为 n
的正方形子序列可以通过合并两个序列产生a
和 b
与 length_of_a + length_of_b = n
成一个序列。由于所有的正方形序列都可以通过将序列与 length == 2
合并来导出,合并操作可以简化为仅使用长度为 2 的序列作为第二个参数。
private static List<Integer> merge(List<Integer> a , List<Integer> b)
{
if(a.contains(b.get(0)) || a.contains(b.get(1)))
return null;
List<Integer> result = new ArrayList<>(a);
result.addAll(b);
Collections.sort(result);
//check whether the indices from b have been inserted correctly
//split the sequence into two parts of same length, now the position of b.get(0)
//in the first part must be equal to the position of b.get(1) in the second part
if(result.indexOf(b.get(1)) - result.indexOf(b.get(0)) == result.size() / 2)
return result;
else
return null;
}
因为任何有效的子序列 length > 2
由许多带有 length == 2
的正方形序列组成, 我们可以通过简单地用 length 2
找到所有可能的方形序列组合来确保找到所有可能的方形序列.
public static void sqrSubseqCount(String in)
{
List<List<Integer>> len_2_seq = listDoubleSequences(in);
List<List<Integer>> prev_round = new ArrayList<>(len_2_seq);
final Set<List<Integer>> next_round = new HashSet<>();
int count = len_2_seq.size();
System.out.println();
System.out.println("Searching longer sequences:");
while(!prev_round.isEmpty())
{
next_round.clear();
prev_round.forEach(l -> len_2_seq.forEach(l2 -> {
List<Integer> merge = merge(l , l2);
if(merge != null && !next_round.contains(merge))
{
next_round.add(merge);
printSeq(in , merge);
}
}));
count += next_round.size();
prev_round.clear();
prev_round.addAll(next_round);
}
System.out.println();
System.out.println("Total sequences found: " + count + " in: " + in);
}
注意事项:这是我用来打印序列的方法。
private static void printSeq(String in , List<Integer> seq)
{
String seqStr = "";
//convert the sequence of indices into the string represented
//by seq
for(int i : seq)
seqStr += in.charAt(i);
System.out.println(seq + " => " + seqStr);
}
大部分代码都可以通过多种方式进行优化,但我尽量使其尽可能简单。
关于java - 方形子序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30215083/
我目前有一个程序,可以简单地在屏幕上绘制一个正方形,但是,我试图向这个正方形添加垂直线,它确实打印到屏幕上,但不是它定义的完整长度,而且不是广场内。任何帮助将不胜感激! #include int m
.products { width: 100%; height: 500px; background: gray; } .box { width: 250px; height: 3
I need the square-symbolized character have the square shape that fills entire the character's area,
我们应该知道,Clojure 的 map 可以应用于序列: (map #(* %1 %1) [1 2 3]) ; (1) ..或者多个,通过这种方式: (map vector [0
我正在尝试用 HTML/CSS 制作类似这样的东西:https://gyazo.com/6db0d2e3565414c10b65480c5d4b7526 我正在使用一个 Bootstrap 模板,我想
当我为我的 fab 设置颜色时,它看起来像这样: 我的布局 xml: 颜色也不会改变。谁能帮助我理解我做错了什么? 我也尝试过使用 @color 链接但它崩溃了,背景是可绘制的 (ex. andr
我有一个带有圆形图像的自定义按钮。 问题是 Controller 默认是方形的,所以每当我单击图像的角时,按钮都会响应调用关联的方法,而实际上他不应该这样做,因为角上没有图像,所以按钮不应响应。 有人
您好,我的页面顶部有一个 div http://www.uk-sf.com/MyTraining.php box-shadow 被切割在 wrapper 上,我试着给它一个 z-index 但没有任何
我有一个包含图像的 div。此图像仅在元素悬停时显示,因此我希望侧箭头从指向侧面的 div 出来(在元素悬停的方向)。 此代码生成正方形 div: CSS: #image-t
我在 Android 项目中使用 ImageView。 宽度:match_parent高度:wrap_content 然后我将它缩放到 fill_XY,但图像还不是正方形...我该怎么办? 最佳答案
我正在尝试使用 div 创建一个 2x2 网格。一些 div 可能包含图像,但它可能会被设置为背景,选项为 background-size: cover。 这是我创建的笔:http://codepen
* { box-sizing: border-box; } .publication { display: flex;
我有以下代码: 结果: 如何使 View 的高度与其宽度相等(由 layout_weight 产生)? 最佳答案 您必须重写 onMeasure 方法,将高度设置为与高度相
我正在开发照片编辑应用程序,我有 3 个带有 UIImageview 的 ScrollView ,我想将 ScrollView 设置如下 我试过“Scenekit”,但它不起作用,因为我想要 Scro
在不使用 SVG 图像的情况下,使用 React 可以在其中包含自定义文本来创建圆形和方形的方法是什么?一个例子: 我尝试了以下代码,但它没有呈现任何形状: import React from 're
我想要一个没有滚动条的响应式 9x9 div 网格。 div 网格应根据可见的浏览器窗口调整大小。我合并了"How to maintain the aspect ratio of a div usin
我第一次尝试使用Picasso 如官方网站示例: private void setItemBgImageUsingPicasso(View convertView) { String imag
尝试为 Android 使用 Dagger 依赖注入(inject)器。这是扩展的应用程序类: public class MyApplication extends Application {
我使用 Bootstrap 3 的 .thumbnail 类创建了一个图像网格。在调整图像大小和根据窗口大小更改列方面,一切似乎都很好。唯一的问题是图像的大小各不相同,并且纵向/横向都是。这会导致缩略
我正尝试通过 Square 在我的 iOS 应用程序中实现 OAuth2,但它说当我通过弹出的浏览器成功登录时,我的 redirect_uri 出现错误。 我正在使用 OAuthSwift pod。这
我是一名优秀的程序员,十分优秀!