当前位置: 首页 > 知识库问答 >
问题:

如何以词法方式订购子串

金英华
2023-03-14

我想按字母顺序排列字符串“s”的子串,长度为“k”

我尝试首先使用comapareTo函数对字符串的字符进行词法排序,然后尝试打印第一个和最后一个子字符串

public static String getSmallestAndLargest(String s, int k) {
    String smallest = "";
    String largest = "";
    char ch1,ch2,temp;
    int i,j,res; 

    // 'smallest' must be the lexicographically smallest substring of length 'k'
    // 'largest' must be the lexicographically largest substring of length 'k'
    for(i=0;i<s.length();i++)
    {
        ch1=s.charAt(i);
        for(j=i+1;j<=s.length();j++)
        {
            ch2=s.charAt(j);
            res=ch2.compareTo(ch1);
            if(res<0)
            {
                temp=ch2;
                ch2=ch1;
                ch1=temp;
            }
        }
    }
    smallest=s.substring(0,k);
    largest=s.substring(s.length()-k);
    return smallest + "\n" + largest;
}

预期输出:将字典上最小和最大的子字符串作为单个换行符分隔的字符串返回。

input: welcometojava
3

expected output:ava
wel

共有2个答案

王飞英
2023-03-14

我们初始化max和min作为大小为k的第一个子字符串。我们通过删除前一个子字符串的第一个字符并添加新字符串的最后一个字符来遍历剩余的子字符串。我们跟踪字典上最大和最小的。

public class GFG { 

public static void getSmallestAndLargest(String s, int k) 
{ 
    // Initialize min and max as first substring of size k 
    String currStr = s.substring(0, k); 
    String lexMin = currStr; 
    String lexMax = currStr; 

    // Consider all remaining substrings. We consider 
    // every substring ending with index i. 
    for (int i = k; i < s.length(); i++) { 
        currStr = currStr.substring(1, k) + s.charAt(i); 
        if (lexMax.compareTo(currStr) < 0)      
             lexMax = currStr; 
        if (lexMin.compareTo(currStr) > 0) 
             lexMin = currStr;             
    } 

    // Print result. 
    System.out.println(lexMin); 
    System.out.println(lexMax); 
} 

// Driver Code 
public static void main(String[] args) 
{ 
    String str = "GeeksForGeeks"; 
    int k = 3; 
    getSmallestAndLargest(str, k); 
} 

}

井修雅
2023-03-14

你的想法是对的,但你试图比较单个字符。相反,在每次迭代中,你应该取一个长度为k的子字符串,并将其与当前的“最小”和“最大”字符串进行比较:

public static String getSmallestAndLargest(String s, int k) {
    String curr = s.substring(0, k);
    String smallest = curr;
    String largest = curr;
    for (int i = 1; i < s.length() - k + 1; ++i) {
        curr = s.substring(i, i + k);
        if (smallest.compareTo(curr) > 0) {
            smallest = curr;
        }
        if (largest.compareTo(curr) < 0) {
            largest = curr;
        }
    }
    return smallest + "\n" + largest;
}
 类似资料:
  • 问题内容: 我有以下查询: 是否有根据最相关结果进行分类的策略? 问题答案: 当谈论“相关性”时,您确实想要自然语言搜索,这是MySQL全文搜索支持的。语法是比正常的不同 一样 的查询,你需要一个特殊的索引添加到表中,但排序按相关性可能是这样。 这是MySQL计算相关性的方式(来自链接): 如前面的示例所示,在WHERE子句中使用MATCH()时,返回的行将自动按照相关性最高的顺序进行排序。相关性

  • 现在使用了Pypy首创的“紧凑”表示形式。与Python3.5相比,新的dict()的内存使用量减少了20%到25%。PEP 468(保留函数中**kwargs的顺序。)是通过这个来实现的。这个新实现的保序方面被认为是一个实现细节,不应该被依赖(这在将来可能会改变,但是在更改语言规范以强制所有当前和将来的Python实现的保序语义之前,希望在几个版本中使用这个新的dict实现;这也有助于保持与仍然

  • 问题内容: 我有一个这样的表: 我想创建一个有序的表单,如下所示: 在数据库中,有很多书,而不仅仅是一本书。 有没有办法以这种方式对查询“ SELECT”进行排序?这只是一个表面问题,不需要做多维数组之类的事情,因为我可以在标签上贴上它们的类型,然后根据类型更改它们的外观。但是我需要以正确的顺序查找查询。 PD:对不起,我的英语:S 问题答案: 不要以为数据库是个好主意。查询将很难。Imo更好-您

  • 问题内容: 我目前有使用PIVOT生成如下表的查询: 我想做的是,但看起来像是拉伸,结果是值递减。 这是查询: 这样做会产生错误,因此可以指定列吗? 问题答案: 试试这个:

  • 问题内容: 我试图以这样一种方式编写SQL Server 2008查询,以便可以根据需要循环遍历输出和输出标头。我已经多次以错误的方式完成了这些工作,并让ColdFusion在页面中进行了艰苦的工作,但是需要在SQL Server中完成。 我希望查询结果集如下所示: 如果ParentID为0,则表示它是主要类别。如果ParentID大于0,则表示它是次要类别,是父级的子级。 因此,父母需要订购A-