class Builder {

        /**
         * Utility constructor.
         */
        private Builder() {
        }

        /**
         * Creates new {@link StrAlgoArgs} by keys.
         *
         * @return new {@link StrAlgoArgs} with {@literal By KEYS} set.
         */
        public static StrAlgoArgs keys(String... keys) {
            return new StrAlgoArgs().by(By.KEYS, keys);
        }

        /**
         * Creates new {@link StrAlgoArgs} by strings.
         *
         * @return new {@link StrAlgoArgs} with {@literal By STRINGS} set.
         */
        public static StrAlgoArgs strings(String... strings) {
            return new StrAlgoArgs().by(By.STRINGS, strings);
        }

        /**
         * Creates new {@link StrAlgoArgs} by strings and charset.
         *
         * @return new {@link StrAlgoArgs} with {@literal By STRINGS} set.
         */
        public static StrAlgoArgs strings(Charset charset, String... strings) {
            return new StrAlgoArgs().by(By.STRINGS, strings).charset(charset);
        }

    }

    /**
     * restrict the list of matches to the ones of a given minimal length.
     *
     * @return {@code this} {@link StrAlgoArgs}.
     */
    public StrAlgoArgs minMatchLen(int minMatchLen) {
        this.minMatchLen = minMatchLen;
        return this;
    }

    /**
     * Request just the length of the match for results.
     *
     * @return {@code this} {@link StrAlgoArgs}.
     */
    public StrAlgoArgs justLen() {
        justLen = true;
        return this;
    }

    /**
     * Request match len for results.
     *
     * @return {@code this} {@link StrAlgoArgs}.
     */
    public StrAlgoArgs withMatchLen() {
        withMatchLen = true;
        return this;
    }

    /**
     * Request match position in each strings for results.
     *
     * @return {@code this} {@link StrAlgoArgs}.
     */
    public StrAlgoArgs withIdx() {
        withIdx = true;
        return this;
    }

    public StrAlgoArgs by(By by, String... keys) {
        LettuceAssert.notNull(by, "By-selector must not be null");
        LettuceAssert.notEmpty(keys, "Keys must not be empty");

        this.by = by;
        this.keys = keys;
        return this;
    }

    public boolean isWithIdx() {
        return withIdx;
    }

    public StrAlgoArgs charset(Charset charset) {
        LettuceAssert.notNull(charset, "Charset must not be null");

        this.charset = charset;
        return this;
    }

    public enum By {
        STRINGS, KEYS
    }

    @Override
    public <K, V> void build(CommandArgs<K, V> args) {<FILL_FUNCTION_BODY>


        args.add("LCS");
        args.add(by.name());
        for (String key : keys) {
            if (by == By.STRINGS) {
                args.add(key.getBytes(charset));
            } else {
                args.add(key);
            }
        }
        if (justLen) {
            args.add("LEN");
        }
        if (withIdx) {
            args.add("IDX");
        }

        if (minMatchLen > 0) {
            args.add("MINMATCHLEN");
            args.add(minMatchLen);
        }

        if (withMatchLen) {
            args.add("WITHMATCHLEN");
        }
    
<no_super_class>