3. Convert your string to bytes and pad it with zeros until it is 160 bits (20 bytes)
4. Encode the result using Base58check (feed the 160-bit result to the encoder as if you are feeding the RIPEMD160 hash of a public key, it should add the address version byte to it and compute and append the checksum as well)
I need the result address to have the string, not the bytes before base58check encoding.
An address cannot be an arbitrary string because the address itself is not stored in the block chain. Block chain explorers and wallets analyze a transaction to construct the address. As @pooya87 described, a legacy address is constructed from a 160-bit hash, plus a version and a checksum. The version and checksum are mostly out of your control.