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

更快的方法来检查我们是否可以从给定的信件中写消息

公良弘毅
2023-03-14

我需要编写一个以两个字符串作为输入的函数。一个是我要写的信息,第二个是给我的信。字母的顺序是随机的。不能保证每个字母出现的次数是相似的。有些字母可能会完全丢失。函数应该确定我是否可以用给定的字母写消息,并且它应该相应地返回true或false。

我编码了它,我认为它是非常快的,但我如何改进它,记住,带字母的字符串将是非常大的,而消息将是非常短的?

有最快的方法吗?

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class LetterBowl {

    public static void main(String []args){
        String message = generateRandomStringUpToThousandChars();
        String bowlWithLetters = generateRandomStringUpToThousandChars();

        if(canConstructMessage(message, bowlWithLetters)) {
            System.out.println("Message '" + message + "' can be constructed with letters from bowl : " + bowlWithLetters);
        }
     }


    public static boolean canConstructMessage(String message, String letters) {
        Map<Character,Integer> letterMap = stringToCharacterMap(letters);
        char[] messageList = stringToCharacterList(message);

        for(char c : messageList) {
            if (!containsLetterAndSubtract(c,letterMap))
                return false;
        }
        return true;
    }


    // checks if map(bowl) contains char andsubtract one char from map(or removes it if it is last one)
    public static boolean containsLetterAndSubtract(char c, Map<Character,Integer> letterMap) {
        if(letterMap.containsKey(c)) {
            if(letterMap.get(c) > 1) {
                letterMap.put(c, letterMap.get(c) - 1);
            } else {
                letterMap.remove(c);
            }
            return true;
        }
        return false;
    }

    public static char[] stringToCharacterList(String message) {
        return message.replaceAll(" ", "").toCharArray();
    }

    public static Map<Character,Integer> stringToCharacterMap(String s) {
        Map<Character,Integer> map = new HashMap<Character,Integer>();

        for (char c : s.toCharArray()) {
            if(map.containsKey(c))
                map.put(c, map.get(c) + 1);
            else
                map.put(c, 1);
        }
        return map;
    }

    public static String generateRandomStringUpToThousandChars(){
        char[] chars = "abcdefghijklmnopqrstuvwxyz".toCharArray();

        StringBuilder sb = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < random.nextInt(1000); i++) {
            char c = chars[random.nextInt(chars.length)];
            sb.append(c);
        }
        String output = sb.toString();

        return output;
    }; 

}

对于大碗大小和较小的味精大小,我发现这将是非常有效的:

公共静态布尔canConstructMessageSorted(String message,String bowlWithLetters){int counter=0;布尔HasLetter;

    //sorting
    char[] chars = bowlWithLetters.toCharArray();
    Arrays.sort(chars);
    String sortedBowl = new String(chars);

    //sorting
    chars = message.toCharArray();
    Arrays.sort(chars);
    String sortedMsg = new String(chars);

    for (int i = 0; i < sortedMsg.length(); i++) {
        hasLetter = false;
        for(  ; counter < sortedBowl.length() ; counter++) {
            if(sortedMsg.charAt(i) == sortedBowl.charAt(counter)) {
                hasLetter = true;
                break;
            }
        }
        if(!hasLetter) return false;
    }
    return true;
}

共有1个答案

令狐声
2023-03-14

您的操作为O(消息大小+字母大小)。这是我手头能算出的最低最坏情况下的时间复杂度。提到最快的方法,总有更多的你可以做。例如,定义方法

public static char[] stringToCharacterList(String message)

而且只使用一次在技术上是没有时间效率的。您可以简单地将代码主体放在canConstructMessage()方法中,从而避免将另一个项放在堆栈上,并从堆栈中取出。虽然这是一小段时间,但当你说最快的时候,它可能是值得谈论的。

 类似资料:
  • 问题内容: 我正在传递一个accountid作为XML文件的输入,如图所示,稍后将对其进行解析并将在我们的代码中使用: 问题是,如果没有传递任何内容(accoutnid中的空值)作为accountid传递,我将无法在Java代码中处理这种情况。我尝试了这个,但是没有成功: 我可以使用以下方法成功解决此问题: 我们可以依靠该方法来检查a的空条件吗?这有效吗? 问题答案: 不,绝对不是-因为如果为nu

  • 本文向大家介绍python检查指定文件是否存在的方法,包括了python检查指定文件是否存在的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python检查指定文件是否存在的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的Python程序设计有所帮助。

  • 问题内容: 这是对该问题的后续跟踪 因此,首先,您会注意到无法对要连接的字符串列表执行,python告诉您改为使用,这是个好建议,因为无论您如何在字符串上使用,性能都很差。 “不能使用”限制不适用于,尽管这是执行这种列表平整的首选方法。 但是什么时候是列表绝对是不好的。 但是它应该保持这种状态吗? 我比较了三种方法 结果: 在清单清单上:10.46647310256958。好吧,我们知道。 :0.

  • 我试图写一个方法来检查一个给定的单词是否是回文,但到现在为止它还不能工作。我怀疑错误出在if语句中,而且您没有将对象(如字符串)与==进行比较,而是与equals进行比较,对吗?但是Java不允许我写:if(firstthalf.charat(i).equals(secondhalf.charat(j))),那么我该怎么做才能使它工作呢?代码中还有其他错误吗? null null 提前道谢! /尼

  • 本文向大家介绍编写Golang程序以检查给定数字是否为质数,包括了编写Golang程序以检查给定数字是否为质数的使用技巧和注意事项,需要的朋友参考一下 定义: 一个数字是大于2且只能被其自身和1整除。 示例:素 数是2、3、5、7、11、13、113、119等。 解决这个问题的方法 步骤1:找到给定数字的平方根sq_root =√num 步骤2:如果给定数字可被[2,sq_root]所属的数字整除

  • 检查给定行是否为java代码的正确方法是什么? 输入:日志支持。java:44 com/sun/activation/registries/LogSupport日志(Ljava/lang/String;)五、 预期输出:false。 输入:扫描仪输入=新扫描仪(系统输入); 预期输出:true。 我尝试了EclipseJDTASTParser来检查是否可以创建AST。代码如下: 但这是行不通的。有