【发布时间】:2020-05-20 02:15:40
【问题描述】:
我得到一个字符串,我必须从中找出满足以下条件的子字符串
子字符串中的所有字符都相同。例如:aa,bbb,cccc。
除中间字符外的所有字符都必须相同。 如:aba、bbabb等
我做了一个类似这样的算法
我使用两个循环来获取字符串第一个循环保存第一个字符,第二个循环遍历字符串。
然后我将子字符串发送到 vet() 以查看子字符串是否包含小于或等于两个字符。 如果子字符串包含两个字符,那么我检查它是否是回文
public static int reverse(String s)
{
String wrd="";
for(int i = s.length()-1 ;i>=0;i--)
wrd = wrd + s.charAt(i);
if(s.equals(wrd))
return 1;
else
return 0;
}
public static boolean vet(String s)
{
HashSet<Character> hs = new HashSet<>();
for(char c : s.toCharArray())
{
hs.add(c);
}
if(hs.size() <= 2)
return true;
else
return false;
}
static long substrCount(int n, String s) {
List<String> al = new ArrayList<>();
for(int i=0;i<s.length();i++)
{
for(int j=i;j<s.length();j++)
{
if(vet(s.substring(i,j+1)))
{
if(reverse(s.substring(i,j+1)) == 1)
al.add(s.substring(i,j+1));
}
}
}
return al.size();
}
此代码适用于小字符串,但是如果字符串很大,例如一万个字符,则此代码将引发时间限制异常。
我怀疑破坏字符串并在 substrCount() 中创建子字符串的循环会导致时间复杂度,因为它具有嵌套循环。
请查看此代码并提供更好的方法来中断字符串,或者如果由于其他部分而导致复杂性增加,请告诉我。
【问题讨论】:
-
为什么使用 python 标签
-
我已经删除了标签....它是一个基于算法的问题,所以它写在哪个语言上并不重要。
-
应该返回重叠的子字符串吗?例如。输入
"ababa"可以说有子串["aba", "bab", "aba"],或者输入"aabaacaa"可以说有子串["aa", "aabaa", "aba", "aa", "aacaa", "aca", "aa"]。 -
你能不能用一个计数数组{Dictionary/Map}来计算在字符串中找到字符的次数,因此你可以找到解决方案。
-
@Abal 链接到问题?
标签: java string algorithm substring time-complexity